2016-03-07 25 views
4

我正在爲一個函數編寫一個單元測試,該函數又調用一個使用實體框架的存儲過程。存儲過程返回null或整數。我試圖嘲笑這部分。我試過以下在存儲過程的情況下,我如何讓我的mockContext.Setup返回?

mockContext.Setup(c => c.SP_DoSomething(param1, param2)).Returns(ObjectResult<int?> ???); 

我想在我的模擬中返回0。我怎樣才能做到這一點?

回答

3

該類ObjectResult<T>是一個密封的類沒有任何公共C'tor,初始化/設置方法。

您可以使用PrivateObject Class或使用reflaction,但是這兩個選項都不會提供優雅/可讀的解決方案。

優雅/可讀的解決方案是使用代碼編織工具,如MsFakes/Typemock Isolator;在下面的例子中我使用MsFakes:

var queryResult = new List<int?>() { 0 }; 

var fakeQueryResult = new ShimObjectResult<int?> 
{ 
    GetEnumerator =() => queryResult.GetEnumerator(), 
    GetIListSourceListInternal =() => queryResult, 
    GetEnumeratorInternal =() => queryResult.GetEnumerator() 
}; 

mockContext.Setup(c => c.SP_DoSomething(param1, param2)).Returns(fakeQueryResult); 
+0

關於退換貨(fakeQueryResult),我得到「無法將類型 'System.Data.Objects.Fakes.ShimObjectResult <...>' 到「System.Data.Entity.Core.Objects.ObjectResult <...>' – user2027080

+0

@ user2027080,你沒有「僞造」正確的類型,你已經從命名空間System.Data.Objects而不是System.Data.Entity.Core.Objects生成了一個填充。 –

+0

真棒,它現在正在工作,我修好了..謝謝! – user2027080

相關問題