使用Typemock隔离器可以模拟Microsoft.AspNet.Identity.Owin.SignInManager<TUser, TKey>.HasBeenVerifiedAsync()
,因为它允许你模拟几乎所有的ASP.NET MVC。
下面是一个使用HasBeenVerifiedAsync()
方法(从Visual Studio MVC模板)的方法的例子:
[AllowAnonymous]
public async Task<ActionResult> VerifyCode(string provider, string returnUrl, bool rememberMe)
{
// Require that the user has already logged in via username/password or external login
if (!await SignInManager.HasBeenVerifiedAsync())
{
return View("Error");
}
return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe });
}
这是测试:
[TestMethod,Isolated]
public async void TestMethod1()
{
// Arrange
AccountController controller = new AccountController();
// Mocking SignInManager.HasBeenVerifiedAsync()
Isolate.WhenCalled(() => controller.SignInManager.HasBeenVerifiedAsync()).WillReturn(Task.FromResult(true));
// Act
var result = await controller.VerifyCode("tester", "test.com", true) as ViewResult ;
// Assert
Assert.AreEqual("tester", (result.Model as VerifyCodeViewModel).Provider);
Assert.AreEqual("test.com", (result.Model as VerifyCodeViewModel).ReturnUrl);
Assert.IsTrue((result.Model as VerifyCodeViewModel).RememberMe);
}
你可以阅读更多关于它here。
我会写一个接口,其中包含您使用的这个类的所有方法。然后,您可以将该接口用作依赖项,并轻松地嘲笑测试中的接口。实现将很简单,因为您只需将调用转发给SignInManager。 – Oliver
我同意奥利弗。包装器实现类应该非常简单。如果你真的不想使用它,你就会坚持支付能拦截非虚拟方法的软件,比如TypeMock。 –