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 に答える