2013-05-30 38 views
0

我有一個接口(稱爲IRepository),有這樣它的方法:NSubstitute不能設置返回值(CouldNotSetReturnException)

IEnumerable<TEntity> ExecuteStoredProcedure<TEntity>(string functionName, 
             params Tuple<string, object>[] parameters); 

我想設置方法將返回的內容時,它是通過所謂的我的單元測試。就像這樣:

dataAccess = Substitute.For<IRepository>(); 
dataAccess.ExecuteStoredProcedure<MyCustomReturnType>(null, null) 
      .ReturnsForAnyArgs(MyCustomReturnList); 

當我運行測試,我得到這個異常:

NSubstitute.Exceptions.CouldNotSetReturnException:找不到一個電話從返回。

該消息繼續謹慎試圖用實際的類來做到這一點,但這並不適用於我。

我試圖改變我的null PARAMS要的東西更真實:

ExecuteStoredProcedure<MyCustomReturnType>("", new Tuple<string, object>[]{null}) 

但是這並沒有幫助...

任何想法,我做錯了這個替代品?

(我的猜測是,它有事情做與params關鍵字)。

+0

本示例使用最新的NSub發行版:https://gist.github.com/dtchepak/05179a90ad59623b21b3您可以發佈該測試與代碼之間的任何差異嗎? –

+0

感謝您的工作代碼。讓我意識到這是我的靜態類(該名單)沒有在通話之前設置。 (請參閱我的答案以獲取更多詳細信息。) – Vaccano

回答

1

所以,這就是簡化堆棧溢出可以給你帶來麻煩。

列表MyCustomReturnList實際上是一個靜態類中的列表。由於傳遞列表作爲返回值並未實際影響類,因此未調用靜態構造函數(設置列表)。不知何故(對細節不太確定),對尚未設置的列表有一個「引用」,以至於NSubstitute無法設置返回值(可能是因爲它沒有被初始化)。

NSubstitute可以做得更好的唯一的事情是一個不同的錯誤消息。但是錯誤出現在我的代碼中,而不是NSubstitute中。

+1

您能否爲我發送一個repro案例?然後我可以看到是否有方法檢測它並改善錯誤信息。 –

+0

@DavidTchepak - 我試了一個小時纔得到這個repro在一個包含的場景。我不知道我做了什麼,但是我無法在WPF應用程序之外實現它......如果我有時間,我會嘗試再次嘗試重現它。 – Vaccano