【问题标题】:Moq MembershipProviderMoq MembershipProvider
【发布时间】:2013-01-06 02:44:54
【问题描述】:

我正在尝试使用 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"]);
}

【问题讨论】:

  • 哪一行给出了错误?
  • 不熟悉起订量,但起订量是否允许模拟具体类? MembershipProvider 不是接口。

标签: asp.net-mvc tdd moq


【解决方案1】:

我看不到你在哪里使用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 了解更多信息。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多