我正在开发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);
}
答案 0 :(得分:0)
您提出两个不同的问题:
您应该在测试中使用IAuthenticationProvider
的模拟,而不是具体的FormsAuthWrapper
。如果没有完整的Web上下文(您将无法从单元测试中获得),后者将无法工作。
不太确定这个,但我想你只是在嘲笑错误的属性:它应该是Url
而不是UrlReferrer
(它们通常评估为相同的值,但它们 not 引用相同的字符串对象。)