asp.net MVC - 最小起订量会员资格提供商



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

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

我猜我没有正确地嘲笑会员提供者。 通常我会做一个模拟。Object() 来获取新的模拟对象,但我不确定如何处理我的模拟成员资格提供程序。

[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

因此,从外到内看,控制器实际上使用的是真实或具体的会员提供程序。检查 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],了解为什么应该模拟角色而不是对象。

最新更新