2013-07-03 26 views
12

Sono nuovo di laravel. Sto provando a verificare che l'autenticazione funzioni per il mio sito Web e voglio testare il processo di autenticazione in un caso di test. Creo un database sqlite in memoria, creo un nuovo utente e utilizzo il metodo ->save() di eloquente per archiviarlo nel database. Ho installato un filtro di autenticazione che controlla per il nome utente nel database e, a seconda che esso sia permette all'utente di effettuare il login o ritorna "credenziali non valide"test di filtri in laravel 4

// mio file UserTest.php:

class UserTest extends TestCase { 

public function testUsernameIsNotRequired() 
{ 
    // Create a new User 
    $user = new User; 
    $user->username = "[email protected]"; 
    $user->password = "123456"; 
    //$user->password_confirmation = "password"; 

    // User should save 
    $this->assertTrue($user->save()); 

    // Save the errors 
    $password = $user->getAuthPassword(); 

    // There should be 0 error 
    $this->assertEquals("123456",$password); 
    $this->seed(); 

    $this->be($user); 

    $this->assertTrue(Redirect::route('authFilter')); 
} 
} 

solo per farti sapere che il db in memoria viene perso una volta che il test è completo, poiché tutte le connessioni sono andate perse, quindi voglio verificare che l'utente che ho salvato nel mio db sia inserito correttamente e in secondo luogo voglio controllare se Posso accedere al mio sito web usando le informazioni di questo nuovo utente.

// mio file filters.php:

Route::filter('auth', function() 
{ 
    if (Auth::guest()) return Redirect::guest('login'); 
}); 


Route::filter('auth.basic', function() 
{ 
    return Auth::basic('username'); 
}); 

Route::filter('guest', function() 
{ 
    if (Auth::check()) return Redirect::to('/'); 
}); 

Route::filter('csrf', function() 
{ 
    if (Session::token() != Input::get('_token')) 
    { 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 

stavo cercando di collegare un filtro a un percorso in modo che io possa reindirizzare il percorso durante la mia prova e che chiama il filtro auth.basic così ho può testare il mio filtro, so che sto facendo un sacco di cose sbagliate in modo non esitate a correggere eventuali errori che si incontrerete

mio file routes.php:>

Route::get('/', function() 
{ 
    return View::make('hello'); 
}); 

Route::get('/authtest', array('as'=>'/authtest','before' => 'auth.basic', function() 
{ 
    return View::make('hello'); 
})); 

Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function() 
{ 
    Route::resource('url', 'UrlController'); 
}); 

Route::get('authFilter', array('as'=>'authFilter','before' => 'auth.basic', function() 
{ 
    return Auth::basic('username'); 
})); 

ho anche au regolatore RI che ha tutte le pagine del mio sito web

this è quello che ho seguito per creare il mio controller uri per il momento

Ho bisogno di un banco di prova che crea un utente lo memorizza nel database in memoria e poi si autentica utilizzando le informazioni degli utenti. Se qualcuno conosce i test di laravel per i filtri, per favore fatemi sapere che ho cercato la documentazione per testare i filtri, ma suppongo che non sia ben documentata.

ringraziamento

+0

quali errori si ottengono? –

+0

F Tempo: 0 secondi, Memoria: 13.00Mb C'era 1 fallimento: 1) UserTest :: testUsernameIsNotRequired affermando Impossibile che illuminano \ Http \ RedirectResponse Object ( 'richiesta' => Illuminate \ Http \ Object Request ( ........ GUASTI! Test: 1, Asserzioni: 3, Errori: 1. – tanzeelrana

risposta

23

filtri sono disabile in test su laravel 4.

È possibile utilizzare Route::enableFilters() nel test di costringere i filtri.

È possibile leggere le varie discussioni sul perché/perché non testare i filtri;

+0

Questi collegamenti non sembrano avere una "discussione" effettiva sul perché/perché no, solo asserzioni che "dovresti" testare ciascun componente in isolamento Anche se questo commento non ha spazio per entrare nei dettagli, un paio di argomenti sono: 1) Si devono "testare i componenti in isolamento perché i test di unità non devono fare affidamento su extern dipendenze (che moltiplica i requisiti del test) 2) Non si devono "testare i controller senza filtri perché questo si traduce in un accoppiamento stretto - piuttosto che controllare che un'azione del controller si comporti correttamente, si basa su di essa con una particolare implementazione di quel comportamento. –

2

È possibile mantenere la maggior parte di questo nel test di unità.

public function testMyFilter() { 
// Set up route with filter.             
Route::get('testFilter', ['before' => 'myfilter', function() 
{                 
     return 'Hello World';          
}]); 
// Enable filters. 
Route::enableFilters(); 

// Be a user. 
$this->be($this->user); 

// Make a request that will use the filter.         
$response = $this->client->request('GET', 'testFilter'); 

// Check the response. 
$this->assertResponseOk(); 
} 
+0

Ho provato questo, ma ottengo: Errore irreversibile: chiamata a un membro function driver() su un oggetto non in /project/directory/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php on line 165 durante l'esecuzione del test. – jshou

+0

Oops! sembra che non includa "parent :: setUp();" nella mia funzione setUp. – jshou