0

いくつかのレガシー コードの単体テストを記述して (途中で更新して)、既存のアプリケーションをクリーンアップしようとしています。私は多くのライブラリを書き直しましたが、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 が発生します。

この問題にはいくつかの奇妙な点があります。

  1. 最初のテスト メソッド ( ) をコメント アウトするtest_login_alreadyLoggedInと、2 番目のテストはパスします。

  2. 2 つのテスト メソッドの順序を逆にすると、test_login_notLoggedIn成功とtest_login_alreadyLoggedIn失敗になります (つまり、クラスの最初のメソッドが成功し、2 番目のメソッドが失敗します)。

これは、ある種の構成の問題のように見えます-最初のテスト(合格)の後、何かが台無しになり、2番目のテストで要求を行うことができません-しかし、私は途方に暮れています. 私は本とグーグルを何度か調べましたが、欠落している構成への参照が見つかりません。

助言がありますか?

4

2 に答える 2

2

に置き換えることで、この問題を解決できますrequire_once()require()

于 2014-07-13T03:43:28.997 に答える