2017-03-31 76 views
0

I'm使用起訂量嘲笑我的應用程序的一些對象,而現在,我需要模擬這一呼籲:模擬深層次的方法

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

起訂量返回模擬不帶擴展方法的工作。根據錯誤信息,可以推斷'GetInt32'是一種擴展方法。儘量避免嘲笑你不能控制的類型。建議:將您試圖訪問的內容封裝在您控制的抽象背後,以便在需要時進行模擬。 – Nkosi

+0

@Nkosi - 它有點不同。擴展方法正在使用的類型可能會被模擬。 (仍然可以直接執行此操作,但需要設置模擬層次結構) – Pawel

+0

@Pawel是正確的,並且可以在這種情況下工作,因爲所討論的擴展方法的源代碼是開源的,所以我們能夠確定需要什麼嘲笑擴展方法的工作。請注意,對於封閉源代碼擴展,同樣不適用。 – Nkosi

回答

2

GetInt32是在操作的擴展方法接口。您需要模擬ISession接口,這樣TryGetValue方法返回的預期值(GetInt32呼叫Get其中ISession接口調用TryGetValue),然後從HttpContext.Session