2016-05-16 39 views
0

有没有办法模拟Microsoft.AspNet.Identity.Owin.SignInManager<TUser, TKey>.HasBeenVerifiedAsync()方法?如何模拟SignInManager <TUser,TKey> .HasBeenVerifiedAsync()方法

嘲讽方法

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: m => m.HasBeenVerifiedAsync() 

这是确定,当我得到这个例外,我不知道这种方法是不是虚拟的。是否有可能通过其内部来嘲讽它,还是有其他解决方法?

+3

我会写一个接口,其中包含您使用的这个类的所有方法。然后,您可以将该接口用作依赖项,并轻松地嘲笑测试中的接口。实现将很简单,因为您只需将调用转发给SignInManager。 – Oliver

+0

我同意奥利弗。包装器实现类应该非常简单。如果你真的不想使用它,你就会坚持支付能拦截非虚拟方法的软件,比如TypeMock。 –

回答

1

使用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