2013-07-03 25 views
12

Ich bin neu in Laravel. Ich versuche zu testen, dass die Authentifizierung für meine Website funktioniert, und ich möchte den Authentifizierungsprozess in einem Testfall testen. Ich erstelle eine SQL-In-Memory-Datenbank, ich erstelle einen neuen Benutzer und verwenden Sie ->save() Methode eloquent, um es in der Datenbank zu speichern. Ich habe Setup einen Authentifizierungsfilter, der für den Benutzernamen in der Datenbank prüft und je nach, dass es entweder kann der Benutzer sich einloggen oder gibt „ungültige Anmeldeinformationen“testen Filter in Laravel 4

// my UserTest.php Datei:

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

nur um Sie wissen zu lassen, dass die In-Memory-Datenbank verloren ist, sobald der Test abgeschlossen ist, da alle Verbindungen verloren gegangen sind. Ich möchte überprüfen, ob der Benutzer, den ich in meiner Datenbank gespeichert habe, korrekt eingefügt wurde Ich kann mich mit den Informationen dieses neuen Benutzers auf meiner Website anmelden.

// my filters.php Datei:

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

Ich habe versucht, einen Filter auf eine Route zu befestigen, so dass ich auf die Strecke während meines Tests umleiten kann, und das ruft den auth.basic Filter so I testen kann mein Filter, ich weiß, Im eine Menge Dinge falsch machen, so wenden Sie sich bitte keine Fehler zu korrigieren, die Sie kommen über

meine routes.php-Datei:>

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

ich habe auch au ri-Controller, der alle Seiten für meine Website hat

this ist, was ich folgte meine uri-Controller für den Moment

ich einen Testfall erstellen muß, die es in die In-Memory-Datenbank eines Benutzer speichern erstellt und dann authentifiziert anhand dieser Benutzerinformationen. Wenn jemand Laravel-Tests für Filter kennt, lassen Sie es mich bitte wissen, dass ich die Dokumentation zum Testen der Filter nachgeschlagen habe, aber ich denke, es ist nicht gut dokumentiert.

danke

+0

Welche Fehler bekommen Sie? –

+0

F Zeit: 0 Sekunden, Speicher: 13.00Mb war es ein Fehlschlag: 1) Usertest :: testUsernameIsNotRequired konnte nicht behaupten, dass Illuminate \ Http \ RedirectResponse Object ( 'request' => Illuminate \ Http \ Request-Objekt ( ........ FEHLER! Tests: 1, Behauptungen: 3, Fehler: 1. – tanzeelrana

Antwort

23

Filter in Tests auf Laravel deaktiviert 4.

Sie Route::enableFilters() in Ihrem Test verwenden können, auf die Filter zu erzwingen.

Sie können die verschiedenen Diskussionen darüber nachlesen, warum/warum Filter nicht getestet werden sollen;

+0

Diese Verbindungen scheinen nicht eine tatsächliche "Diskussion" über warum/warum-nicht, nur Behauptungen zu haben, dass Sie jede Komponente isoliert "testen" sollten. Obwohl dieser Kommentar keinen Platz hat, ins Detail zu gehen, sind ein paar Argumente: 1) Sie sollten Komponenten isoliert testen, weil Unit-Tests nicht auf extern beruhen sollten Alle Abhängigkeiten (die die Testanforderungen vervielfachen) 2) Sie sollten Controller nicht ohne Filter testen, da dies zu einer engen Kopplung führt - anstatt zu überprüfen, ob eine Controlleraktion korrekt funktioniert, verlassen Sie sich auf eine bestimmte Implementierung dieses Verhaltens. –

2

Sie die meisten dieser in der Unit-Test halten.

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

Ich habe das versucht, aber ich bekomme: Fatal error: Aufruf eines Member-Funktionstreibers() auf einem Nicht-Objekt in /project/directory/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php online 165 beim Ausführen des Tests. – jshou

+0

Hoppla! sieht so aus, als hätte ich "parent :: setUp();" in meiner Setup-Funktion. – jshou