FormsAuthentication.SetAuthCookie和Request.url在单元测试中失败

时间:2013-12-21 17:56:29

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 moq

我正在开发asp.net MVC 4应用程序并创建单元测试。我有一个帐户控制器和注册方法,它有两件事:

if (this.Request.Url.ToString().Contains("127.0.0"))
{
    user.AddPermission(UserEntity.PermissionType.BETA_ACCESS);
}

FormsAuthentication.SetAuthCookie(model.UserName, false);

这两行测试都失败了。我g目结舌,发现我们不能使用FormsAuthentication.SetAuthCookie,因为FormsAuthentication是一个静态类,所以我尝试了下面的解决方法:

public interface IAuthenticationProvider
{
    void SetAuthCookie(string username, bool remember);
}

public class FormsAuthWrapper : IAuthenticationProvider
{
    public void SetAuthCookie(string userName, bool remember)
    {
        FormsAuthentication.SetAuthCookie(userName, remember);
    }
}

并且在我使用的控制器操作中:

_authenticationProvider.SetAuthCookie(model.UserName, false);

在我使用的测试方法中:

var wrapper = new FormsAuthWrapper();
AccountController controller = new AccountController(s, config, wrapper);

但是当我调用controller action方法时,它仍然在

上给出了对象引用null错误
_authenticationProvider.SetAuthCookie(model.UserName, false);

我的另一个问题与request.url有关,我在我的测试方法中试过这个:

controller.ControllerContext = CreateStubControllerContext(controller);

var requestStub = Mock.Get(controller.Request);
requestStub.Setup(r => r.UrlReferrer).Returns(new Uri("http://127.0.0.1"));

var RegisterModel = new RegisterModel { UserName = "test2@cc.com", Password = "testpass", ConfirmPassword = "testpass" };    
controller.Register(RegisterModel);

但它在控制器操作中抛出此行的错误:

if (this.Request.Url.ToString().Contains("127.0.0"))
{
    user.AddPermission(UserEntity.PermissionType.BETA_ACCESS);
}

1 个答案:

答案 0 :(得分:0)

您提出两个不同的问题:

  1. 您应该在测试中使用IAuthenticationProvider模拟,而不是具体的FormsAuthWrapper。如果没有完整的Web上下文(您将无法从单元测试中获得),后者将无法工作。

  2. 不太确定这个,但我想你只是在嘲笑错误的属性:它应该是Url而不是UrlReferrer(它们通常评估为相同的值,但它们 not 引用相同的字符串对象。)