2016-05-02 29 views
12

Sto provando a testare i vari input personalizzati FormRequest. Ho trovato soluzioni che:Test unitario FormRequest di Laravel

  1. suggerisco di usare il metodo $this->call(…) e affermare la response con il valore atteso (link to answer). Questo è eccessivo, perché crea una dipendenza diretta su Routing e Controller.

  2. prova di Taylor, dal laravel quadrofound intests/Foundation/FoundationFormRequestTest.php. C'è un sacco di beffe e overhead fatto lì.

Sto cercando una soluzione in cui posso unit test ingressi singolo campo contro le regole (indipendente da altri campi nella stessa richiesta).

Esempio FormRequest:

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', 
    ]; 
} 

test desiderato:

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

    // assertTrue, required 
    // ... 

    // assertFalse, between 
    // ... 
} 

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

come posso unità di test (assert) ogni regola di validazione di ogni campo in isolamento e individualmente?

+0

Beh, come hai detto, FormRequests vengono testati all'interno laravel in modo da non mettere alla prova di nuovo, di convalida vengono anche testati in laravel. Non capisco esattamente cosa vuoi testare esattamente ... – PeterPan666

+0

È una cosa molto semplice, sto cercando di testare le regole di convalida che ho impostato per le mie richieste di moduli. –

+0

Quindi vuoi testare se 'XformRequest :: rules' diciamo' $ first_name === 'required''? – PeterPan666

risposta

12

Ho trovato una buona soluzione su Laracast e ho aggiunto alcune personalizzazioni al mix.

Il Codice

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(); 
} 

Aggiornamento

C'è un e2e approccio allo stesso problema. È possibile POST i dati da verificare per il percorso in questione e quindi vedere se la risposta contiene errori di sessione.

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

E la password con la regola confermata? –