0

我正在尝试使用 Moq 来模拟 MembershipProvider。我收到以下错误

{"访问路径'C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 11.0\

我猜我没有正确地嘲笑 MembershipProvider。通常我会做一个 mock.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"]);
}
4

1 回答 1

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],了解为什么应该模拟角色而不是对象以获取更多信息。

于 2013-02-17T14:09:11.467 回答