2015-04-13 8 views
6

Qui è il mio codice di prova:non possono testare reindirizza quando il test delle unità laravel 5

public function testRegistrationFailsIfNameIsEmpty() 
{ 
    $this->flushSession(); 
    $response = $this->call('POST', '/signup', ['fullname' => '']); 
    $this->assertSessionHasErrors('fullname'); // Passes, expected 
    $this->assertTrue($response->isRedirection()); // Passes, expected 
    $this->assertRedirectedTo('/signup'); // Fails, unexpected. 
} 

Quando chiamo quel metodo, si tratta di convalidare l'input, e se la convalida non riesce, mi reindirizza torna a /signup per mostrare la errori di validazione. L'ho provato manualmente nel browser e funziona come previsto.

Tuttavia, quando eseguo il test dell'unità sopra riportato, l'ultima asserzione non riesce e penso che sia stato reindirizzato a solo / anziché /signup.

Non ho idea del perché lo stia facendo. Se provo che un reindirizzamento è avvenuto, il test passa perché un reindirizzamento fa, si pensa che il reindirizzamento sia a / invece di /signup.

Ho disabilitato tutto il middleware quindi so che non è qualcosa come il middleware degli ospiti che pensa di essere connesso quando non lo sono.

EDIT: Risultati dei test:

There was 1 failure: 

1) RegistrationTest::testRegistrationFailsIfNameIsEmpty 
Failed asserting that two strings are equal. 

--- Expected 
+++ Actual 
@@ @@ 
-'http://localhost/signup' 
+'http://localhost' 
+0

Avete la possibilità di eseguire il debug del codice, altrimenti mi sento di raccomandare a installare tale un ambiente, sarà utile molte volte. – martinstoeckli

+0

Come si verifica il metodo POST nel browser? sei sicuro di non aver provato GET? –

risposta

0

vi consiglio di stampare oggetto Response da controller con dd() quando l'unità prove della singola prova. Questo ti mostrerà dove viene fatto esattamente il redirect. Il motore di test delle unità analizza solo l'oggetto Response e credo che il problema sia nel codice piuttosto che nel test dell'unità.

+0

L'ho fatto, la posizione sta sicuramente tornando alla radice, quindi il test sta funzionando appropriatamente come previsto, ma ora la domanda è perché il reindirizzamento sta tornando a casa nell'ambiente di test, mentre nel browser (locale) sta andando dove dovrebbe. Ho ispezionato il traffico delle richieste nel browser e non vi è alcun reindirizzamento intermedio a casa e quindi ritorno a/registrazione, quindi non sono sicuro del motivo per cui si sta comportando così com'è. Inoltre, non ci sono log degli errori che indicano che un 500 viene lanciato e per qualche motivo reindirizzamento verso casa. – AgmLauncher

+1

Come appare RedirectResponse quando si dd() nel controller prima del reso? Dovrebbe mostrare targetUrl e statusCode che indicano dove è stato reindirizzato. Questo ti aiuta a capire da dove cominciare a guardare cosa va storto. –

3

Ho riscontrato lo stesso problema durante il test di un'app Laravel. Sembra che quando usi $ this-> chiama il test e poi il tuo controller usa qualcosa come Redirect :: back(), il reindirizzamento viene inviato a "/". Credo che sia perché non eri su nessuna pagina quando hai fatto "$ this-> call" in modo che l'applicazione non sia sicura su dove reindirizzare, a meno che tu non sia esplicito sul reindirizzamento nel controller, ad esempio redirect ('somePage') .

Tuttavia, quando si fa qualcosa come $ this-> actingAs ($ user) -> visit ('somePage') -> premere ('someButton'), si viene correttamente rimandati alla pagina prevista quando si usa Redirect :: back(). Probabilmente perché l'app sa su quale pagina hai iniziato.

0

Potresti controllare il test che colpisce la funzione di reindirizzamento nel controller puoi mettere un dado in funzione e trovare dove è l'errore Dovrebbe essere un problema nel metodo. quindi controlla che entri effettivamente nella parte di reindirizzamento

2

L'utilizzo di request() -> validate() restituirà l'url di chiamata se la convalida fallisce. Quando si eseguono i test di unità, non c'è nessuna pagina di chiamata in modo da essere diretto a casa.

https://laravel.com/docs/5.5/validation#quick-writing-the-validation-logic

se la convalida non riesce, un'eccezione saranno gettati e la corretta risposta di errore verrà automaticamente inviato indietro per l'utente. Nel caso di una tradizionale richiesta HTTP , una risposta di reindirizzamento verrà generato

Così si sia bisogno di testare che il reindirizzamento è di casa, o fudge l'url di chiamata.Anche se poi si sta solo testando il validatore piuttosto che il vostro codice, che in realtà non aggiunge nulla:

session()->setPreviousUrl('/calling/url'); 

https://www.neontsunami.com/posts/testing-the-redirect-url-in-laravel

+0

Se potessi dare questo più upvotes, vorrei – mils

Problemi correlati