2017-03-31 42 views
0

- 私自分のアプリケーションのいくつかのオブジェクトを模擬するために部品番号を使用して、そして今のところ、私はこの呼び出しを模擬する必要があります。モック深いレベルのメソッド

accessor.HttpContext.Session.GetInt32("offset"); 

私はこの方法を実行しようとしましたが、機能していません。

var mock = new Mock<HttpContextAccessor>(); 
     mock.Setup(x => x.HttpContext.Session.GetInt32("offset")) 
      .Returns(0); 

それはこのエラーを発生させます:

System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.HttpContext.Session.GetInt32("offset")

+0

部品番号からモックを返す(ISessionインターフェイス上TryGetValueを呼び出しGetInt32コールGet)を返すようにISessionインターフェイスを模擬する必要があります。これはエラーメッセージに基づいて、 'GetInt32'が拡張メソッドであると推論することができます。あなたがコントロールしていない型を欺くのは避けてください。アドバイス:あなたが制御している抽象化の背後でアクセスしようとしているものを包み込み、必要なときに嘲笑することができます。 – Nkosi

+0

@Nkosi - それはちょっと違う。拡張メソッドで使用されている型を嘲笑することができます。 (これを直接行うことはできますが、モック階層を設定する必要があります) – Pawel

+0

@Pawelこれは正しいです。問題の拡張メソッドのソースがオープンソースであるため、このような状況で動作するはずです。拡張メソッドが機能するように嘲笑したクローズドソースエクステンションについては同じことが成り立たないことに注意してください。 – Nkosi

答えて

2

GetInt32はで動作する拡張メソッドでありますインターフェース。あなたはTryGetValue方法が期待値と、その後の拡張メソッドでは動作しませんHttpContext.Session

関連する問題