MyTetra Share
Делитесь знаниями!
Как тестировать страницы Laravel-приложения, которые защищены каптчей
30.07.2019
19:29
Текстовые метки: php, laravel, phpunit, тестирование, тесты, captcha, капча, каптча
Раздел: Компьютер - Программирование - Язык PHP - Laravel - Тестирование в Laravel

Когда ищешь в интернете информацию о том, как организовать тестирование веб-приложения, в котором используется каптча, то обычно находишь примерно такой ответ:



В коде проверки каптчи нужно узнать имя сервера, на котором крутится сайт. Если это сервер тестирования, то просто нужно пропускать проверку каптчи или применить какое-нибудь заранее установленое значение ответа (по сути, пароль) для прохода проверки каптчи.



Такое решение быстрое и понятное, но совсем не технологичное. Здесь будет написано, как организовать проход каптчи в тестируемом приложении, построенном на фреймверке 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;

}



Этот метод просто глабольно перекрывает работу валидатора каптчи, и каптча будет проходиться при вводе любых значений.


 
MyTetra Share v.0.52
Яндекс индекс цитирования