質問

Moqを使用したモックから設定されたセッション値を返すときに問題が発生します。次を使用

public class TestHelpers
{
 public long sessionValue = -1;
 public HttpContextBase FakeHttpContext()
 {

  var httpContext = new Mock<HttpContextBase>();
  var session = new Mock<HttpSessionStateBase>();
  httpContext.Setup(x => x.Session).Returns(session.Object);
  httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue);
  httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) =>
        {
           sessionValue = (long)val;
        });
  }
}

使用して外部の値を取得しようとすると

var th = new TestHelpers();
HttpContextBase httpContext = th.FakeHttpContext();

Session [&quot; id&quot;]を設定することを行う

var sessionid = httpContext.Session["id"];

sessionidは-1になります。ただし、

を使用して設定されたセッション値を取得できます
th.sessionValue

何が問題なのですか? Moqを介して設定値を単に返すことはできませんか?

役に立ちましたか?

解決

自分の質問への回答を停止する必要があります。 Session [&quot; id&quot;]を再びモックする必要があることがわかりました...

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) =>
        {
           sessionValue = (long)val;
           httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue);
        });

他のヒント

Moqの Setup メソッドは、文字列インデックスを持つインデックス付きプロパティでは機能しません。こちらをご覧ください:インデックス付きプロパティをMOQする方法

値で渡されたゲッターで値を返しているためです。したがって、ゲッターを呼び出すたびに、同じ値が返されます。

Returns()を変更してデリゲートを使用し、毎回評価されるようにします。そうすれば、毎回正しい値を取得できます:)

SetupSetに組み込まれたSetupGetよりも、目にはずっと簡単です。

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) => sessionValue = (long)val);
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue);

moqを使用してそれを行う最も簡単な方法を見つけようとして長い時間を費やしました。以下は、実際に機能していたコードのコピーです。

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller

var mock = new Mock<ControllerContext>();
mock.Object.Controller = _adminctrl.Object;
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel());
 //here is the catch, attaching the ControllerContext to your controller
_adminctrl.Object.ControllerContext = mock.Object;

これがお役に立てば幸いです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top