2013-07-03 26 views
12

Jestem nowy w laravel. Próbuję przetestować, że uwierzytelnianie działa dla mojej witryny i chcę przetestować proces uwierzytelniania w przypadku testowym. Tworzę bazę danych sqlite w pamięci, tworzę nowego użytkownika i używam metody wymownej do przechowywania jej w bazie danych. Mam skonfigurować połączenie filtra uwierzytelniania, który sprawdza, czy nazwa użytkownika w bazie danych i zależności, że albo pozwala użytkownikowi zalogować lub zwraca „nieprawidłowych poświadczeń”testowanie filtrów w laravel 4

// mój plik 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')); 
} 
} 

tylko po to, aby poinformować, że db w bazie danych zostanie utracony po zakończeniu testu, ponieważ wszystkie połączenia z nim są tracone, więc chcę sprawdzić, czy użytkownik, który zapisałem w swoim db, jest poprawnie wstawiony, a następnie chcę sprawdzić, czy Mogę zalogować się na mojej stronie internetowej, korzystając z informacji tego nowego użytkownika.

// mój plik 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; 
    } 
}); 

Próbowałem podłączyć filtr na trasie tak, że mogę skierować do trasy podczas mojego testu i która wywołuje filtr auth.basic więc można przetestować filtr, wiem, że robię wiele rzeczy źle więc prosimy, aby skorygować ewentualne błędy, które się spotkałem

mój plik 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'); 
})); 

mam też au Kontroler ri która ma wszystkie strony na mojej stronie

this jest to, co następnie utworzyć mój uri kontroler do momentu

muszę przypadek testowy, który tworzy użytkowników zapisuje je do bazy danych w pamięci, a następnie uwierzytelnia się, wykorzystując informacje o użytkownikach. Jeśli ktoś zna testy laravel dla filtrów, proszę dać mi znać, że sprawdziłem dokumentację do testowania filtrów, ale myślę, że nie jest dobrze udokumentowana.

dziękuję

+0

jakie błędy dostałeś? –

+0

F Czas: 0 sekund, Pamięć: 13.00Mb Było 1 awaria: 1) UserTest :: testUsernameIsNotRequired Failed twierdząc, że Illuminate \ http \ RedirectResponse Object ( 'żądanie' => Illuminate \ http \ Obiekt żądania ( ........ AWARIE! Testy: 1, twierdzenia: 3, błędy: 1. – tanzeelrana

Odpowiedz

23

Filtry są wyłączone w testach na laravel 4.

Można użyć Route::enableFilters() w teście zmusić filtrów.

Możesz przeczytać różne dyskusje na temat dlaczego/dlaczego nie testować filtrów;

+0

Te linki nie wydają się mieć rzeczywistej "dyskusji" o tym, dlaczego/dlaczego-nie, tylko twierdzenia, że ​​"powinieneś" testować każdy komponent w izolacji. Chociaż ten komentarz nie ma miejsca na szczegóły, kilka argumentów to: 1) Należy "testować" elementy oddzielnie, ponieważ testy jednostkowe nie powinny opierać się na danych zewnętrznych. al zależności (które mnożą wymagania testowe) 2) Nie "powinieneś" testować kontrolerów bez filtrów, ponieważ powoduje to ścisłe sprzężenie - zamiast sprawdzać, czy działanie kontrolera działa poprawnie, polegasz na nim, mając konkretną implementację tego zachowania. –

2

Można zachować większość to w badanej jednostki.

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

Próbowałem tego, ale otrzymuję: Błąd krytyczny: Wywołanie do sterownika funkcji elementu() na obiekcie innym niż obiekt w /project/directory/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php on line 165 podczas uruchamiania testu. – jshou

+0

Ups! wygląda na to, ponieważ nie zawierałem "parent :: setUp();" w mojej funkcji setUp. – jshou