2017-02-03 6 views
0

mockオブジェクトを設定して、入力変数の1つを呼び出し元に返すようにしています。MoqはIEnumerableをエコーバックして空に戻りますか?

_resultThrottler = new Mock<IResultThrottler>(); 
_resultThrottler 
    .Setup(x => x.Throttle(It.IsAny<IEnumerable<ProductResult>>(), It.IsAny<Guid>())) 
    .Returns((IEnumerable<ProductResult> input, Guid resultSetId) => input); 

実際には出力が常に空の場合は常に空です。

var throttledResults = _resultThrottler.Throttle(results, resultSetId).ToList(); 

何が間違っていますか?

EDIT:要求されたとして:

public interface IResultThrottler 
{ 
    IEnumerable<TType> Throttle<TType>(IEnumerable<TType> collectionToThrottle, 
     Guid sessionId) where TType : ProductResult; 
} 

変数resultsのための完全な初期化シーケンスはかなり複雑ですが、テストでは長さ5の種類System.Collections.Generic<IEnumerable<(type that inherits from ProductResult)>>の対象としてで行く、と出てきています長さが0の模擬オブジェクトの

+1

完全性のために、 'results'の宣言/初期化を追加できますか? –

+1

そして 'IResultThrottler.Throttle()'の定義です。 –

答えて

1

実際の特定のタイプではなく、継承されたタイプを使用してモックしようとしていたことがMoqのように思われたようです。

私は型パラメータを取るために、コード移動しました -

public class ResultThrottlerStubBuilder<TType> where TType : ProductResult 
{ 
    private Mock<IResultThrottler> _resultThrottler; 
    public IResultThrottler Build() 
    { 
     _resultThrottler = new Mock<IResultThrottler>(); 
     _resultThrottler 
      .Setup(x => x.Throttle(It.IsAny<IEnumerable<TType>>(), It.IsAny<Guid>())) 
      .Returns((IEnumerable<TType> input, Guid resultSetId) => input); 

     return _resultThrottler.Object; 
    } 
} 

にマッチするテストコードを変更して、テストが今渡します。あなたの意見を正しい方向に向けるコメント欄コメント:

+0

ああ、これらはMoqに関する限り異なるタイプ( 'IEnumerable 'と 'IEnumerable ')ですので、異なる設定が必要です。 –

+0

それらは、そのような特定の設定を必要とするほど十分に違いますが、基本クラスに設定した場合、完全に間違った型で宣言された場合と同じように、参照例外がnullになります。 – eftpotrm

関連する問題