如何在 asp.net mvc 2 中使用 fakeiteasy 伪造用户登录以进行单元测试

发布于 2024-10-05 19:57:26 字数 1042 浏览 1 评论 0原文

我刚刚开始学习和使用 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(); };
}

到目前为止,一切都很好。但是,我想测试经过身份验证的用户点击家庭控制器时的场景。我陷入了如何模拟经过身份验证的用户的困境,欢迎任何帮助或建议。

蒂亚,

大卫

I have just started learning and usingASP.NET MVC 2 and also getting more involved into unit testing my code. My question is broadly how to simulate a user log in by passing in credentials within my test.

I am using MSpec and trying to get my head around fakeiteasy in order to write up my test. So far, I believe I've written one test correctly (It passes the test condition) for when an unauthenticated user tries to access a page.

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

So far so good. However, I'd like to test for the scenario for when an authenticated user hits the home controller. I'm stuck in how to simulate an authenticated user and any help or advice would be welcome.

TIA,

David

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最舍不得你 2024-10-12 19:57:26

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

这成功了!谢谢帕特里克!

After getting in touch with Patrik Hagne, the creator of FakeItEasy, he came up with the following:

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

That did the trick! Thanks Patrik!

旧时模样 2024-10-12 19:57:26

以下是伪造身份的方法:

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 属性时,它将指向所提供的伪造主体。

Here's how you could fake the identity:

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

Now when you use HomeController.User property it will point to the fake principal which was provided.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文