Moq MembershipProvider

时间:2013-01-22 18:50:34

标签: asp.net-mvc tdd moq

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

1 个答案:

答案 0 :(得分: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的原因,以获取更多信息。