2013-07-03 113 views
12

我是laravel的新手。我試圖測試認證適用於我的網站,我想在測試用例中測試認證過程。我創建了一個內存中的sqlite數據庫,我創建了一個新的User並使用了雄辯的方法將它存儲在數據庫中。我已經安裝認證過濾器檢查數據庫中的用戶名和取決於它要麼允許用戶登錄或返回「無效憑證」laravel的測試過濾器4

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

只是爲了讓你知道測試完成後內存數據庫丟失了,因爲所有的連接都丟失了,所以我想檢查我保存到我的數據庫的用戶是否已正確插入,其次我想檢查是否我可以使用這個新用戶的信息登錄到我的網站。

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

我試圖過濾器附加到路徑,這樣我可以在我的測試過程中重定向到路線和調用auth.basic過濾器,所以我可以測試我的過濾器,我知道林做了很多事情錯了,所以請隨時糾正你來翻過

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

我也有AU這對於我的網站

this所有頁面裏控制器是什麼我也跟着創建我的URI控制器的時刻

我需要創建一個用戶並將其存儲到內存中的數據庫,然後測試用例使用該用戶信息進行身份驗證。如果任何人知道濾波器的laravel測試,請讓我知道我查閱了測試過濾器的文檔,但我想它沒有很好的記錄。

謝謝

+0

你會得到什麼錯誤? –

+0

F 時間:0秒,記憶:13。00Mb 有1個故障: 1)UserTest :: testUsernameIsNotRequired 無法斷言照亮\ HTTP \ RedirectResponse對象( '請求'=>照亮\ HTTP \請求對象( 。。。。。。失敗! 測試:1,斷言:3,失敗:1. – tanzeelrana

回答

23

過濾器在測試中被禁用的Laravel 4

您可以使用Route::enableFilters()在您的測試,迫使上的過濾器。

您可以閱讀關於爲什麼/爲什麼不測試過濾器的各種討論;

+0

這些鏈接似乎沒有關於爲什麼/爲什麼不實際的「討論」,只有斷言你應該「孤立地測試每個組件」 雖然這個評論沒有足夠的空間去詳細討論,但有幾個參數是: 1)你應該「孤立地測試組件,因爲單元測試不應該依賴於extern (相當於測試要求) 2)你「不應該」在沒有過濾器的情況下測試控制器,因爲這會導致緊密耦合 - 而不是檢查控制器動作是否正常工作,而是依賴於它具有該行爲的特定實現。 –

2

你可以把這個最在單元測試。

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

我試過這個,但是我得到了:致命錯誤:調用/project/directory/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php上的非對象的成員函數驅動程序()運行測試時使用165 。 – jshou

+0

糟糕!看起來像是因爲我沒有包含「parent :: setUp();」在我的設置功能。 – jshou