我刚刚开始学习和使用ASP.NET MVC 2,并更多地参与了单元测试我的代码。我的问题广泛是如何通过在测试中传递凭据来模拟用户登录。

我正在使用MSPEC,并试图使我的头围绕FakeIteasy,以写下我的测试。到目前为止,我相信我已经正确编写了一个测试(通过测试条件),因为未经验证的用户试图访问页面。

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

到现在为止还挺好。但是,我想测试身份验证的用户击中家庭控制器时的情况。我坚持如何模拟身份验证的用户,欢迎任何帮助或建议。

蒂亚,

大卫

有帮助吗?

解决方案

在与Fakeiteasy的创建者Patrik Hagne取得联系后,他提出了以下内容:

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

那就做到了!谢谢帕特里克!

其他提示

这是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 财产将指向所提供的假校长。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top