1

次のようにして、FakeItEasy を使用して MVC コントローラーのセッション オブジェクトをモックしました。

var session = A.Fake<HttpSessionStateBase>();
A.CallTo(() => session["SomeKey"]).Returns("SomeValue");

Controller.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), Controller);

また、コントローラー アクションでセッション オブジェクトにアクセスすると、正しい値が返されます。

public ActionResult Index()
{
    var value = Session["Key"]; // value = "SomeValue" like it is supposed to

    ...
}

この問題は、次のようなセッターを介して同じキーを使用してセッションが設定されているコントローラーで後で発生します。

Session["Key"] = "SomeOtherValue";

そして、キーが使用されると、間違った値が返されます:

var value = Session["Key"]; // value = "Key" 

モックされたセッションはモックされた値を返さず、新しい値も返しませんが、代わりにキーを返します (WTF?!)。私は何を間違っていますか?セッターを使用すると、モックされたオブジェクトは実際にどうなりますか?

4

2 に答える 2

3

ティム・ロングにはその権利があります。「正しい価値」とは?ただし、キーを返すのは奇妙な動作です。

ここに機能リクエストの材料があると思います。(そして、私はそれを作成しました: issue 277 .) getter と setter を持つ未構成のインデックス付きプロパティが値を保存し、後でそれらを返すのは合理的だと思います。

更新: 問題 277 はFakeItEasy 1.21.0で修正されました。NuGet からそれ (または新しいバージョン) を入手してください。

それまでの間、元のメソッドの呼び出しに関する問題を指摘した後に作成したこの新しい例のようなもので回避できます。

[Test]
public void TestItemProperty()
{
    var mySession = new Dictionary<string, object>();
    var session = A.Fake<HttpSessionStateBase>();
    A.CallTo(session)
        .Where(call => call.Method.Name == "set_Item")
        .Invokes((string key, object value) => mySession[key] = value);

    A.CallTo(() => session[A<string>._])
        .ReturnsLazily((string key) => mySession[key]);
    A.CallTo(() => session["key1"]).Returns("value1");

    A.CallTo(() => session["key1"]).Returns("value1");
    Assert.That(session["key1"], Is.EqualTo("value1"));

    session["key2"] = "value2";
    Assert.That(session["key2"], Is.EqualTo("value2"));

    Assert.That(session["key1"], Is.EqualTo("value1"), "second go");
}
于 2014-03-20T00:52:02.333 に答える