2016-05-02 6 views
12

Я пытаюсь выполнить тестирование различных пользовательских входов FormRequest. Я нашел, что решения:Unit Test Laravel's FormRequest

  1. предлагают использовать метод $this->call(…) и утверждать response с ожидаемым значением (link to answer). Это избыток, поскольку он создает прямую зависимость от Маршрутизация и Контроллеры.

  2. тест Тейлора, из Laravel Frameworkfound intests/Foundation/FoundationFormRequestTest.php. Там есть много насмешек и накладных расходов.

Я ищу решение, где я могу модульного тестирования отдельных полей входы против правил (независимо от других полей в одном запросе).

Образца СформироватьЗапрос:

public function rules() 
{ 
    return [ 
     'first_name' => 'required|between:2,50|alpha', 
     'last_name' => 'required|between:2,50|alpha', 
     'email'  => 'required|email|unique:users,email', 
     'username' => 'required|between:6,50|alpha_num|unique:users,username', 
     'password' => 'required|between:8,50|alpha_num|confirmed', 
    ]; 
} 

Желаемый Тест:

public function testFirstNameField() 
{ 
    // assertFalse, required 
    // ... 

    // assertTrue, required 
    // ... 

    // assertFalse, between 
    // ... 
} 

public function testLastNameField() 
{ 
    // ... 
} 

Как модульное тестирование (утверждает) каждое правило проверки каждого поля в отдельности и по отдельности?

+0

Ну, как вы сказали, FormRequests тестируются внутри Laravel, поэтому вам не нужно их повторять, проверка также проверяется в Laravel. Я действительно не получаю то, что вы хотите проверить точно ... – PeterPan666

+0

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

+0

Итак, вы хотите проверить, разрешены ли 'XformRequest :: rules'' $ first_name === 'required''? – PeterPan666

ответ

12

Я нашел хорошее решение на Laracast и добавил некоторые настройки в микс.

Кодекс

public function setUp() 
{ 
    parent::setUp(); 
    $this->rules  = (new UserStoreRequest())->rules(); 
    $this->validator = $this->app['validator']; 
} 

/** @test */ 
public function valid_first_name() 
{ 
    $this->assertTrue($this->validateField('first_name', 'jon')); 
    $this->assertTrue($this->validateField('first_name', 'jo')); 
    $this->assertFalse($this->validateField('first_name', 'j')); 
    $this->assertFalse($this->validateField('first_name', '')); 
    $this->assertFalse($this->validateField('first_name', '1')); 
    $this->assertFalse($this->validateField('first_name', 'jon1')); 
} 

protected function getFieldValidator($field, $value) 
{ 
    return $this->validator->make(
     [$field => $value], 
     [$field => $this->rules[$field]] 
    ); 
} 

protected function validateField($field, $value) 
{ 
    return $this->getFieldValidator($field, $value)->passes(); 
} 

Update

Существует e2e подход к той же проблеме. Вы можете POST данные, подлежащие проверке на рассматриваемый маршрут, а затем посмотреть, содержит ли ответ ошибки сеанса.

$response = $this->json('POST', 
    '/route_in_question', 
    ['first_name' => 'S'] 
); 
$response->assertSessionHasErrors(['first_name'); 
+0

Как насчет пароля с подтвержденным правилом? –