いくつかのレガシー コードの単体テストを記述して (途中で更新して)、既存のアプリケーションをクリーンアップしようとしています。私は多くのライブラリを書き直しましたが、TDD のアプローチをとても気に入っています。しかし、今度はいくつかのコントローラーのテストに移る時が来ました。私は最初の一連のテストで問題に遭遇しました。Jeffery Way のLaravel Testing Decodedの説明に従っています。
ここでの目標は、ログイン ルートをテストすることですhttp://my-development-server/login
。コードは次のように動作するはずです。まず、誰かがすでにログインしているかどうかを確認します。ログインしている場合は、ダッシュボード (アプリのメイン ページ) にリダイレクトします。それ以外の場合は、ログイン ページをレンダリングします。かなり簡単です。
関連するルートは次のとおりです。
Route::get('login', array(
'as' => 'login',
'uses' => 'MyApp\Controllers\AccountController@getLogin',
));
Route::get('/', array(
'as' => 'dashboard',
'uses' => 'MyApp\Controllers\DashboardController@showDashboard',
'before' => 'acl:dashboard.view',
));
AccountController::getLogin
メソッドは次のとおりです。
public function getLogin()
{
// Are we logged in?
if (\Sentry::check())
return Redirect::route('dashboard');
// Show the page.
return View::make('account.login');
}
Sentry
ユーザー認証にライブラリを使用しています。
そして、ここに私の最初のテストがあります:
class AccountControllerTest extends TestCase {
public function tearDown()
{
Mockery::close();
}
public function test_login_alreadyLoggedIn()
{
// arrange
//
\Sentry::shouldReceive("check")
->once()
->andReturn(true);
// act
//
$response = $this->call("GET", "/login");
// assert
//
$this->assertRedirectedToRoute("dashboard");
}
}
このテストは、「ユーザーがすでにログインしているときにログインを試みる」ケースをエミュレートします。check
は true (すでにログイン済み) を返し、ユーザーは という名前のルートにリダイレクトされdashboard
ます。それは完全に機能し、テストはパスします。
次に、「誰もログインしていないときにユーザーがログインを試みる」ケースをテストするために、新しいテストを追加します。そのテストのコードは次のとおりです。
public function test_login_notLoggedIn()
{
// arrange
//
\Sentry::shouldReceive("getUser")
->twice()
->andReturn(null);
\Sentry::shouldReceive("check")
->once()
->andReturn(false);
// act
//
$response = $this->client->request("GET", "/login");
// assert
//
$h2 = $response->filter("h2");
$this->assertEquals("Please sign in", $h2->text());
}
このテストを実行すると、最初のテストはパスしますがNotFoundHttpException
、2 番目のテスト メソッドで a が発生します。
この問題にはいくつかの奇妙な点があります。
最初のテスト メソッド ( ) をコメント アウトする
test_login_alreadyLoggedIn
と、2 番目のテストはパスします。2 つのテスト メソッドの順序を逆にすると、
test_login_notLoggedIn
成功とtest_login_alreadyLoggedIn
失敗になります (つまり、クラスの最初のメソッドが成功し、2 番目のメソッドが失敗します)。
これは、ある種の構成の問題のように見えます-最初のテスト(合格)の後、何かが台無しになり、2番目のテストで要求を行うことができません-しかし、私は途方に暮れています. 私は本とグーグルを何度か調べましたが、欠落している構成への参照が見つかりません。
助言がありますか?