2010-12-02 4 views
6

私は学習し、ASP.NET MVC 2を使い始めています。私の質問は、広く私のテスト内で資格情報を渡すことによってユーザーのログインをシミュレートする方法です。asp.net mvc 2内でfakeiteasyを使用して単体テスト用のユーザーログインを偽装するにはどうすればいいですか?

私は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、

デビッド

答えて

3

パトリックHagne、FakeItEasyの作成者と連絡を取得した後、彼は次のよう思い付いた:トリックをした

[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); 
    }; 
} 

!ありがとうパトリック!

2

はここアイデンティティどのようTOUができた偽物だ:あなたはHomeController.Userプロパティを使用する場合

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

は、今では提供された偽の校長を指します。

+0

こんにちはダーリン、この回答を投稿していただきありがとうございます。残念ながら、A.CallTo(()=> HomeController.User).Returns(fakePrincipal); HomeControllerがテスト中の対象であり、偽のオブジェクトではないため、エラーが発生しています。コードを取得するための提案がありますか? – DavidS

+0

はい、あなたは正しいです。コードを更新しました。 –

+0

それも動作します! – DavidS

関連する問題