2013-07-03 2 views
12

Я новичок в laravel. Я пытаюсь проверить, что проверка подлинности работает на моем сайте, и я хочу протестировать процесс аутентификации в тестовом примере. Я создаю базу данных sqlite в памяти, создаю нового пользователя и использую метод eloquent ->save() для его сохранения в базе данных. Я имею установку фильтра аутентификации, который проверяет имя пользователя в базе данных и в зависимости от того, что он либо позволяет пользователю войти в систему или возвращает «недействительны»испытательные фильтры в 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')); 
} 
} 

просто чтобы вы знали, что бит памяти в памяти теряется после завершения теста, так как все соединения с ним потеряны, поэтому я хочу проверить, правильно ли вставлен пользователь, который я сохранил на своем db, а во-вторых, я хочу проверить, Я могу войти на свой сайт, используя информацию этого нового пользователя.

// мой файл 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'); 
})); 

у меня также есть а.е. ри контроллер, который имеет все страницы на моем сайте

this, что я следовал, чтобы создать свой Uri контроллер на данный момент

мне нужен тест, который создает пользователя сохраняет его в базу данных в оперативной памяти, а затем аутентифицирует эту информацию пользователей. Если кто-либо знает тестирование laravel для фильтров, пожалуйста, дайте мне знать. Я просмотрел документацию для тестирования фильтров, но, я думаю, это плохо документировано.

спасибо

+0

какие ошибки вы получаете? –

+0

F Время: 0 секунд, Память: 13.00Mb Был 1 неудача: 1) UserTest :: testUsernameIsNotRequired Failed утверждая, что Осветите \ Http \ RedirectResponse Object ( 'запрос' => Осветите \ Http \ Request Object ( ........ FAILURES! Тесты: 1, Утверждения: 3, Неудачи: 1. – tanzeelrana

ответ

23

Фильтры отключены в тестах на Laravel 4.

Вы можете использовать Route::enableFilters() в тесте, чтобы заставить фильтры.

Вы можете прочитать о различных дискуссиях о том, почему и почему не тестировать фильтры;

+0

Эти ссылки, похоже, не имеют фактического «обсуждения» о том, почему/почему-нет, только утверждения, что вы «должны» тестировать каждый компонент по отдельности. Хотя этот комментарий не имеет места для подробностей, пара аргументов: 1) Вы «должны» тестировать компоненты отдельно, потому что модульные тесты не должны полагаться на внешние (которые умножают требования к тестированию) 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 on line 165 при запуске теста. – jshou

+0

Упс! похоже, что это потому, что я не включил «parent :: setUp();» в моей функции setUp. – jshou

Смежные вопросы