2

MoqHttpContext.Request.Url.Authorityは非仮想メソッドであるため、モックに使用できないようです。次の例外が発生します。

{"Invalid setup on a non-virtual (overridable in VB) member: p => p.HttpContext.Request.Url.Authority"}

どうすればこれを克服できますか?以下は私のテスト方法です:

[TestMethod]
public void ForgottenPasswordPost_Requested_CaptchaCorrectEmailExists()
{
    _testModel.ControllerContext.SetupGet(p => p.HttpContext.Session["Captcha"]).Returns("HelloWorld");
    _testModel.ControllerContext.SetupGet(p => p.HttpContext.Request.Url.Authority).Returns("www.localhost.com");
    _testModel.QMember.Setup(m => m.MemberExistsWithEmail(It.IsAny<string>())).Returns(true);


    var controllerUnderTest = _testModel.ReturnController();
    ForgottenPasswordModel model = new ForgottenPasswordModel() { Captcha = "HelloWorld" };

    //Act
    var actionResult = (RedirectToRouteResult)controllerUnderTest.ForgottenPassword(model);

    Assert.AreEqual("ForgottenPasswordConfirm", actionResult.RouteValues["action"]);
    Assert.AreEqual("a", actionResult.RouteValues["controller"]);
}

public class TestModel
{
    public UnregisteredController Controller { get; set; }
    public Mock<ControllerContext> ControllerContext { get; set; }
    public Mock<IQ_Member> QMember { get; set; }

    public TestModel()
    {
        ControllerContext = new Mock<ControllerContext>();
        QMember = new Mock<IQ_Member>();
    }

    public UnregisteredController ReturnController()
    {
        Controller = new UnregisteredController(QMember.Object);
        Controller.ControllerContext = ControllerContext.Object;
        return Controller;
    }
}
4

1 に答える 1

4

この SO postによると、Moq を使用してのみ仮想/抽象メンバーを実装できます。

ASP.NET MVC 以外の一般的なケースでは、次のいずれかを実行できます。

  1. 非仮想の具体的なクラス メンバーのオーバーライドを可能にするモック ツールを使用するか、

  2. 静的/非仮想メンバーへのパススルー メソッドを使用して独自のラッパー クラスを記述し、これらのラッパー クラスからインターフェイスを抽出し、これらのインターフェイスに依存する残りのコードを設計します。これにより、簡単にモックして依存関係を挿入できます。

かなりの量の作業が必要になりますが、上記の 1 よりも 2 をお勧めします

ただし、あなたの場合、かなり簡単な解決策があると思います。

コードの行で

_testModel.ControllerContext.SetupGet(p => p.HttpContext.Request.Url.Authority).Returns("www.localhost.com");
  • .HttpContext抽象的であるため、嘲笑することができます
  • .Request抽象的であるため、嘲笑することができます
  • .Url仮想であるため、嘲笑することができます
  • .Authorityは非仮想文字列プロパティであり、これが問題の原因です

.Urlモックできる最も深い部分であるため、代わりにこれを試してください。

_testModel.ControllerContext.SetupGet(p => p.HttpContext.Request.Url).Returns(new Uri("http://www.localhost.com"));
于 2013-04-19T21:29:40.390 に答える