|
|||||||
Как тестировать страницы Laravel-приложения, которые защищены каптчей
Время создания: 30.07.2019 19:29
Текстовые метки: php, laravel, phpunit, тестирование, тесты, captcha, капча, каптча
Раздел: Компьютер - Программирование - Язык PHP - Laravel - Тестирование в Laravel
Запись: xintrea/mytetra_syncro/master/base/1564154469kmkb7ppbpx/text.html на raw.github.com
|
|||||||
|
|||||||
Когда ищешь в интернете информацию о том, как организовать тестирование веб-приложения, в котором используется каптча, то обычно находишь примерно такой ответ: В коде проверки каптчи нужно узнать имя сервера, на котором крутится сайт. Если это сервер тестирования, то просто нужно пропускать проверку каптчи или применить какое-нибудь заранее установленое значение ответа (по сути, пароль) для прохода проверки каптчи. Такое решение быстрое и понятное, но совсем не технологичное. Здесь будет написано, как организовать проход каптчи в тестируемом приложении, построенном на фреймверке Laravel 5.x, с использованием стандартной каптчи mews/Captcha (разработчик mewebstudio). Самое главное, что можно обойтись только средствами тестирующей среды, не изменяя код самого приложения. Создание Mock-заглушки в методе createApplication Первый метод заключается в том, чтобы привязать Mock-заглушку каптчи к контейнеру приложения. Инициализация контейнера приложения обычно происходит в файле: ./tests/CreatesApplication.php В данном файле, в методе createApplication(), нужно прописать примерно такой код: class TestCase extends Illuminate\Foundation\Testing\TestCase { /** * Creates the application. * @return \Illuminate\Foundation\Application */ public function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); // Override captcha binding with a double that always passes. $app->bind('captcha', function($app) { $mockCaptcha = Mockery::mock(Mews\Captcha\Captcha::class); $mockCaptcha ->allows() ->img() ->andReturn(''); $mockCaptcha ->allows() ->check('12345') ->andReturn(true); return $mockCaptcha; }); return $app; } } Данный код создает Mock-заглушку класса каптчи, и регистрирует её в контейнере приложения (регистрация происходит через метод bind() контейнера приложения). Эта заглушка настраивается так, что при запросе картинки она возвращает пустую картинку, а при вызове проверки всегда возвращает true. Тестирующий код в стиле BrowserKitTesting, который проходит такую перенастроенную каптчу, может выглядеть так: class UserRegistrationTest extends TestCase { /** * @test * @return void */ public function redirected_to_login_page_after_good_registration() { $this->visit('/register') ->type('TestUserName', 'username') ->type('testemail@localhost.com', 'email') ->type('testemail@localhost.com', 'email_confirmation') ->type('testpassword', 'password') ->type('testpassword', 'password_confirmation') ->type('12345', 'captcha') ->press('Submit') ->seePageIs('/login') ->see('Thank you for registering.'); } } Переопределение валидатора каптчи Имеется еще один вариант по прохождению каптчи. Можно просто переопределить валидатор каптчи в веб-приложении так, чтобы он всегда возвращал "истина". Делается это следующим кодом: public function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); // Override the validation captcha extension to always return true. $app['validator']->extend('captcha', function() { fwrite(STDOUT, print_r('Bypassing captcha validation and returning explicit true!', TRUE)); return true; }); return $app; } Этот метод просто глабольно перекрывает работу валидатора каптчи, и каптча будет проходиться при вводе любых значений. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|