2013-01-22 62 views
0

我想使用Moq来模拟MembershipProvider。我收到以下错误Moq MembershipProvider

{“访问路径“C:\ PROGRAM FILES \微软的Visual Studio 11.0 \

我猜,我不能正常嘲讽的MembershipProvider通常我做一个模拟.Object()来获得新的嘲笑对象,但我不能确定什么跟我嘲笑的MembershipProvider做。

[TestMethod] 
public void LogUserIntoSystem_post_CorrectUsernameAndPassword() 
{ 
    var model = new LoginModel 
    { 
     LoginName = "Bobby", 
     Password = "bob", 
     RememberMe = true 
    }; 

    var membership = new Mock<MembershipProvider>(); 
    membership.Setup(x => x.ValidateUser("Bobby", "bob")).Returns(true); 
    var controllerUnderTest = _testModel.ReturnController(); 

    //act 
    controllerUnderTest.Login(model, string.Empty); 

    //assert 
    var actionResult = (RedirectToRouteResult)controllerUnderTest.Home(); 
    Assert.AreEqual("Home", actionResult.RouteValues["action"]); 
    Assert.AreEqual("P", actionResult.RouteValues["controller"]); 
} 
+0

什么行会给你错误? – PatrickSteele

+0

不熟悉Moq,但Moq是否允许混凝土类被嘲弄? MembershipProvider不是一个接口。 – bas

回答

0

我看不到你在哪里使用MembershipProvider

从外面

所以,它出现控制器实际上是使用真实的或具体的MembershipProvider。经过MSDN检查,该类是一个抽象基类,所以Moq应该可以使用这个类,尽管我会推荐一种不同的方法。

class TwistedInfernosMembershipProvider : IMembershipProvider 
{ 
    public bool ValidateUser(string username, string password) 
    { 
     // Call the real .NET membership provider here... 
    } 
} 

然后在你的控制器我会做到以下几点:

var testProvider = new Mock<IMembershipProvider>(); 
testProvider.Setup(x => x.ValidateUser("Bobby", "bob").Returns(true); 
var subject = new ControllerUnderTest(testProvider.Object()); 

通过这样做,你有抽象的,你如何验证用户的详细信息。您可以将此实现切换为实现IMembershipProvider的任何类,您的代码或测试都不会在乎。这也意味着您可以轻松地使用此抽象测试您的控制器。请记住,Moq需要一个接口或基类/虚拟方法才能正常运行。

查看本文[PDF]有关更多信息,请参见mock roles, and not objects