Как да използвате Laravel Dusk за тестване на Stripe (Cashier)

Не можах да намеря никой, който да опише как се прави това. Ако има по-добър начин или ресурс, моля, уведомете ме.

Моля, не забравяйте да прочетете предупрежденията в долната част на публикацията.

Stripe.js или Stripe v2

Това е по-старият остарял метод, но все още се използва от редица сайтове.

Първо бърз преглед на това, което се случва, за да разберете по-добре предизвикателството да го изпробвате. Когато кликнете върху бутона за плащане, в горната част на екрана се наслагва рамка с рамка. Вътре в този кадър е начинът на плащане. След като се извърши плащане, рамката отминава.

Така че трябва да кликнем върху бутона за плащане, да преминем към рамката на Stripe iframe, да въведем информацията за плащането и misc, да кликнем върху бутона за плащане, да изчакаме процеса и след това да оставим рамката.

В този пример използвах този код, за да създам бутон и модал:

Което създава този бутон:

И този модал:

Имайте предвид, че въвеждането на пощенски код е активирано, но той не се показва, докато не започнете да въвеждате номера на кредитната си карта. Което е друго предизвикателство.

Ето и теста:

Важните части:

Изчакайте да се отвори наслагването на iframe:

-> чакайте ( "вградена рамка [име = stripe_checkout_app])

Преминете към използване на тази рамка:

$ Browser-> шофьора> switchTo () -> рамка ( "stripe_checkout_app ');

Изчакайте iframe да изчезне:

-> waitUntilMissing ( "вградена рамка [име = stripe_checkout_app])

Забележка: Имам най-много проблеми с това. Той се проваля постоянно, защото отнема известно време до POST и след това изчезва. Само имайте предвид, че може да се наложи да добавите още забавяне, ако имате проблеми

Върнете се по подразбиране:

$ Browser-> шофьора> switchTo () -> defaultContent ();

Забележка: Тази част не е необходима, освен ако нямате повече тестове, които искате да стартирате, след като Stripe е направил това.

Може би се питате за полетата, защо използвах заместителя като селектор? Да разгледаме моето примерно поле за кредитна карта

Забележете действителния входен елемент:

Идентификаторът е произволно поле. Няма и име. Предполагам, че е да се спрат такива неща. Така че използването на заместител е единственото нещо, което изглежда използваемо. Това обаче прави този тест МНОГО крехък.

Stripe v3 или Stripe Elements

За този пример използвах кода Stripe има пример 3 на бързата им начална страница.

Той дава запис, който изглежда като:

Първо бърз преглед на това, което се случва, за да разберете по-добре предизвикателството да го изпробвате. Когато страницата зареди iframe е зареден върху елемент или елементи, които имате, с елементите за въвеждане на кредитна карта върху него.

Така в примера:

Получава размяна с входа на картата, който виждате на снимката на екрана.

Проблемът е, че тъй като е на различна рамка, става стигането до него малко по-сложно. За да тестваме, трябва да изчакаме тези елементи да се заредят, да попълним цялата останала информация, да отидем в рамката на Stripe, да попълним елементите на кредитната карта, да оставим и да се върнем в главния прозорец и да кликнем върху бутона за плащане и накрая изчакайте процеса.

Ето теста на Dusk, който използвах:

Ето важните части:

Изчакайте елементите на лентата да се заредят:

-> чакайте ( "вградена рамка [име = __ privateStripeFrame3])

Промяна на ивицата рамка на Stripe:

$ Browser-> шофьора> switchTo () -> рамка ( "__ privateStripeFrame3 ');

Върнете се по подразбиране:

$ Browser-> шофьора> switchTo () -> defaultContent ();

Имайте предвид, че тези елементи могат много в зависимост от това, което сте използвали. Това обаче трябва да е достатъчно, за да започнете. Наистина най-важната част е да отидете в рамка и обратно.

Почисти

Бен Wrigley попита как да изтрие потребителя от Stripe, когато тестът приключи.

Няма да можете да направите това по време на tearDown (), тъй като имате нужда от потребителя. Така че това ще трябва да бъде в края на самия тест

// Изтриване на абонамента
$ User-> абонамент () -> изтриване ();
// Изтрийте клиента от Stripe
\ Stripe \ Stripe :: setApiKey (\ Config :: получите ( "services.stripe.secret"));
\ Stripe \ Клиент :: извличане ($ user-> stripe_id) -> изтриване ();

Забележка: Изпълнението на последния бит може да отнеме няколко секунди.

Предупреждения

Тези тестове са МНОГО крехки. Всичко, което е необходимо, е Stripe да преименува нещо и вашите Dusk тестове ще спрат да работят.

Няколко пъти съм имал, ако iframe не е напълно зареден и тестът е неуспешен. Това изглежда рядко, но нещо, което трябва да се знае.

Накрая изглежда, че Stripe не харесва това и понякога ще сложи страница за проверка, за да докаже, че сте човек. Натъкнах се на това само веднъж, така че не знам какво го задейства. Очевидно това може да бъде много проблематично.

Ето. Тестване на касиерната лента Laravel с помощта на Laravel Dusk.

Не съм използвал Braintree, но бих предположил, че ще използва подобен метод.

Ако имате някакви по-добри идеи или коментари, моля, уведомете ме по-долу или в Twitter.

Както винаги благодаря на Тейлър Отуел