【问题标题】:How can I unit test my ASP.NET MVC controller that uses FormsAuthentication?如何对使用 FormsAuthentication 的 ASP.NET MVC 控制器进行单元测试?
【发布时间】:2008-12-14 10:48:08
【问题描述】:

我正在以测试驱动的方式使用 ASP.NET MVC 解决方案,我想使用表单身份验证将用户登录到我的应用程序。我希望在控制器中最终得到的代码如下所示:

FormsAuthentication.SetAuthCookie(userName, false);

我的问题是如何编写测试来证明这段代码的合理性?

有没有办法检查是否使用正确的参数调用了 SetAuthCookie 方法?

有没有办法注入一个假的/模拟的 FormsAuthentication?

【问题讨论】:

    标签: asp.net-mvc unit-testing tdd mocking forms-authentication


    【解决方案1】:

    我将首先编写一个接口和一个封装此逻辑的包装类,然后在我的控制器中使用该接口:

    public interface IAuth 
    {
        void DoAuth(string userName, bool remember);
    }
    
    public class FormsAuthWrapper : IAuth 
    {
        public void DoAuth(string userName, bool remember) 
        {
            FormsAuthentication.SetAuthCookie(userName, remember);
        }
    }
    
    public class MyController : Controller 
    {
        private readonly IAuth _auth;
    
        public MyController(IAuth auth) 
        {
            _auth = auth;
        }
    
    }
    

    现在IAuth 可以在单元测试中轻松模拟,并验证控制器是否在其上调用了预期的方法。我不会对FormsAuthWrapper 类进行单元测试,因为它只是将调用委托给FormsAuthentication,它完成了它应该做的事情(微软保证:-))。

    【讨论】:

    • 对此+1,不要测试其他人的框架,只测试你对它们的使用。我们在我们的应用程序中做同样(类似)的事情(包装 FormsAuth 的东西等)
    • sigh Microsoft 为这个框架如此可测试而感到自豪!我希望有一些内置的方法可以在不包装的情况下模拟它。猜不到:(
    • 问题不在于框架不可测试...问题在于 FormsAuthentication 类早于 MVC 的单元测试设计。正如 Darin 所提到的,解决此问题的最佳方法是使用接口将控制器与类与静态方法解耦。
    • 你能举个例子来说明你将如何模拟 IAuth Darin 吗?
    • @Tyler,您应该让 AccountController 在其构造函数中采用 IAuth 接口,并且不再在其中使用任何 FormsAuthentication。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2010-11-26
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多