6

ASP.NET MVC 2の学習と使用を開始したばかりで、コードの単体テストにも深く関わっています。私の質問は、テスト内でクレデンシャルを渡すことによってユーザーログインをシミュレートする方法です。

私はMSpecを使用していて、テストを作成するためにfakeiteasyに頭を悩ませようとしています。これまでのところ、認証されていないユーザーがページにアクセスしようとしたときに、1つのテストを正しく記述した(テスト条件に合格した)と思います。

Subject( typeof( HomeController ) )]
public class context_for_a_home_controller_for_not_logged_user
{
    protected static HomeController HomeController;

    Establish context = () =>
    {
        // Create controller
        HomeController = new HomeController();

        HomeController.ControllerContext = A.Fake<ControllerContext>();
    };
}

[Subject(typeof(HomeController))]
public class when_the_home_page_is_requested : context_for_a_home_controller_for_not_logged_user
{
    static ActionResult result;

    Because of = () => 
        result = HomeController.Index();

    It should_return_the_log_in_page_if_user_not_logged_in = () =>
        { result.ShouldBeAView().And().ShouldUseDefaultView(); };
}

ここまでは順調ですね。ただし、認証されたユーザーがホームコントローラーにアクセスしたときのシナリオをテストしたいと思います。私は認証されたユーザーをシミュレートする方法に固執しており、どんな助けやアドバイスも歓迎します。

TIA、

デビッド

4

2 に答える 2

3

FakeItEasyの作成者であるPatrikHagneと連絡を取った後、彼は次のことを思いつきました。

 [Subject( typeof( HomeController ) )]
public class context_for_a_home_controller_for_logged_user
{
    protected static HomeController HomeController;

    Establish context = () =>
    {
        // Create controller
        HomeController = new HomeController();

        HomeController.ControllerContext = A.Fake<ControllerContext>();
        var fakePrincipal = A.Fake<IPrincipal>();
        var fakeIdentity = new GenericIdentity( "username" );
        A.CallTo( () => fakePrincipal.Identity ).Returns( fakeIdentity );
        A.CallTo( () => HomeController.ControllerContext.HttpContext.User ).Returns( fakePrincipal );
    };
}

それがトリックでした!ありがとうパトリック!

于 2010-12-03T09:46:26.323 に答える
2

touがアイデンティティを偽造する方法は次のとおりです。

Subject( typeof( HomeController ) )]
public class context_for_a_home_controller_for_a_logged_user
{
    protected static HomeController HomeController;

    Establish context = () =>
    {
        // Create controller
        HomeController = new HomeController();

        var fakeControllerContext = A.Fake<ControllerContext>();
        var fakeHttpContext = A.Fake<HttpContextBase>();
        var fakePrincipal = A.Fake<IPrincipal>();
        var fakeIdentity = new GenericIdentity("someusername");

        HomeController.ControllerContext = fakeControllerContext;
        A.CallTo(() => fakeControllerContext.HttpContext).Returns(fakeHttpContext);
        A.CallTo(() => fakeHttpContext.User).Returns(fakePrincipal);        
        A.CallTo(() => fakePrincipal.Identity).Returns(fakeIdentity);
    };
}

これで、プロパティを使用するHomeController.Userと、提供された偽のプリンシパルを指します。

于 2010-12-03T07:09:09.820 に答える