9

嗨,我正在对我的 ASP.Net MVC2 项目进行一些单元测试。我正在使用 Moq 框架。在我的 LogOnController 中,

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl = "")
{
  FormsAuthenticationService FormsService = new FormsAuthenticationService();
  FormsService.SignIn(model.UserName, model.RememberMe);

 }

在 FormAuthenticationService 类中,

public class FormsAuthenticationService : IFormsAuthenticationService
    {
        public virtual void SignIn(string userName, bool createPersistentCookie)
        {
            if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot     be null or empty.", "userName");
            FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
        }
        public void SignOut()
        {
            FormsAuthentication.SignOut();
        }
    }

我的问题是如何避免执行

FormsService.SignIn(model.UserName, model.RememberMe);

这条线。或者有什么办法可以起订量

 FormsService.SignIn(model.UserName, model.RememberMe);

在不更改我的 ASP.Net MVC2 项目的情况下使用 Moq 框架。

4

1 回答 1

11

像这样IFormsAuthenticationService作为依赖注入LogOnController

private IFormsAuthenticationService formsAuthenticationService;
public LogOnController() : this(new FormsAuthenticationService())
{
}

public LogOnController(IFormsAuthenticationService formsAuthenticationService) : this(new FormsAuthenticationService())
{
    this.formsAuthenticationService = formsAuthenticationService;
}

第一个构造函数用于框架,以便IFormsAuthenticationService在运行时使用正确的实例。

LogonController现在在您的测试中,通过传递模拟创建一个使用另一个构造函数的实例,如下所示

var mockformsAuthenticationService = new Mock<IFormsAuthenticationService>();
//Setup your mock here

更改您的操作代码以使用私有字段formsAuthenticationService,如下所示

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl = "")
{
    formsAuthenticationService.SignIn(model.UserName, model.RememberMe);
}

希望这可以帮助。我已经为您省略了模拟设置。如果您不确定如何设置,请告诉我。

于 2012-07-09T14:17:52.707 回答