Тестирование Stripe Checkout с Cypress
Я должен позвонить stripe.redirectToCheckout
( https://stripe.com/docs/js/checkout/redirect_to_checkout) в js, чтобы перенаправить клиента на страницу оформления заказа.
Я хочу использовать кипарисовик для проверки процесса оформления заказа, но он не может обрабатывать перенаправление полосы, поскольку кадр кипариса теряется, когда stripe.redirectToCheckout
переходит на страницу домена Stripe.
Я также хочу проверить, что Stripe перенаправляет нас обратно на URL-адрес успеха или ошибки.
- Есть ли способ заставить Cypress "повторно прикрепиться" к странице после перехода к кассе Stripe -или-
- Есть ли способ получить URL-адрес страницы оформления заказа Stripe, чтобы мы могли перенаправить вручную или просто знать, что он был хотя бы вызван с правильными параметрами.
Я знаю, что тестирование внешних сайтов считается "антипаттерном" людьми в cypress (https://github.com/cypress-io/cypress/issues/1496). Но как в этом случае можно протестировать очень стандартный веб-процесс, кассу (с помощью очень популярной и стандартной платежной службы, я добавлю)? Я не верю, что это "антипаттерн". Это важный этап сквозного тестирования, и Stripe специально предоставляет нам тестовую песочницу для такого рода вещей.
3 ответа
Один из распространенных способов тестирования приложения e2e с внешними зависимостями, такими как stripe, - это создание его простой макетной версии, которая затем применяется в тестировании e2e. Мок также можно применять во время разработки, чтобы ускорить процесс.
Я пытаюсь использовать вместо этого элементы полосы, поскольку он не перенаправляет и дает мне гораздо больше контроля над ним.
Помогло бы это?
it(`check stripe redirection`, () => {
cy.get('#payButton').click();
cy.location('host', { timeout: 20 * 1000 }).should('eq', STRIPE_REDIRECT_URL);
// do some payment stuff here
// ...
// after paying return back to local
cy.location({ timeout: 20 * 1000 }).should((location) => {
expect(location.host).to.eq('localhost:8080')
expect(location.pathname).to.eq('/')
})
})
Я использовал этот метод для проверки входа в систему с помощью keyCloak. Это реальный код, который сработал.
describe('authentication', () => {
beforeEach(() => cy.kcLogout());
it('should login with correct credentials', () => {
cy.visit('/');
cy.location('host', { timeout: 20 * 1000 }).should('eq', 'keycloak.dev.mysite.com:8443');
// This happens on https://keycloak.dev.mysite.com:8443/auth/dealm/...
cy.fixture('userCredentials').then((user) => {
cy.get('#username').type(user.email);
cy.get('#password').type(user.password);
cy.get('#kc-login').click();
cy.location({ timeout: 20 * 1000 }).should((location) => {
expect(location.host).to.eq('localhost:8080')
expect(location.pathname).to.eq('/')
})
})
});