Asp.net mvc 如何对使用FormsAuthentication的ASP.NET MVC控制器进行单元测试?

Asp.net mvc 如何对使用FormsAuthentication的ASP.NET MVC控制器进行单元测试?,asp.net-mvc,unit-testing,tdd,mocking,forms-authentication,Asp.net Mvc,Unit Testing,Tdd,Mocking,Forms Authentication,我正在以测试驱动的方式使用ASP.NET MVC解决方案,我希望使用表单身份验证将用户登录到我的应用程序。我希望在控制器中使用的代码如下所示: FormsAuthentication.SetAuthCookie(userName, false); 我的问题是如何编写测试来证明此代码的合理性 是否有方法检查是否使用正确的参数调用了SetAuthCookie方法 有没有办法注入假/模拟表单身份验证?我会先编写一个接口和一个封装该逻辑的包装类,然后在我的控制器中使用该接口: public inter

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

FormsAuthentication.SetAuthCookie(userName, false);
我的问题是如何编写测试来证明此代码的合理性

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


有没有办法注入假/模拟表单身份验证?

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

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
,并验证控制器是否对其调用了预期的方法。我不会对
FormsAsuthRapper
类进行单元测试,因为它只是将调用委托给
FormsAsuthIdentification
,它完成了它应该做的事情(Microsoft Guarrance:-)。

+1在这方面,不要测试其他人的框架,只测试你对它们的使用情况。我们在我们的应用程序中也做了同样的(类似的)事情(wrap FormsAuth之类的东西),微软为这个框架如此可测试而感到自豪!我希望有一些内置的方式来模拟这个没有包装。我猜不是:(问题不在于框架不可测试……问题在于FormsAuthentication类早于MVC的单元测试设计。正如Darin所提到的,解决这一问题的最佳方法是使用接口将控制器与类与静态方法解耦。你能举一个如何模拟IAuth Darin的例子吗@Tyler,你应该让你的AccountController在它的构造函数中使用一个
IAuth
接口,并且不再在其中使用任何FormsAuthentication。