3

コレクションがあり、メソッド呼び出しIEnumerable<T>をモックしたい。First<T>()私がそれをやろうとしたとき、私はこれを得る:

前のメソッド「IEnumerator.MoveNext();」戻り値またはスローする例外が必要です。

以下のコードを貼り付けています。

IEnumerable<T> collection = MockRepository
    .GenerateStub<IEnumerable<T>>();
collection
    .Stub(x => x.First<T>())
    .IgnoreArguments()
    .Return(MockRepository.GenerateStub<T>());

しかし、x.First<T>上記の例外がスローされます。どうすれば解決できますか?メソッド呼び出しもIEnumeratorモックして を返そうとしました。GetEnumerator()それも役に立ちませんでした。

4

1 に答える 1

5

Tコードが汎用関数内にあるため、それが存在すると仮定します。

First<T>()静的拡張メソッドであるため、呼び出しをスタブすることはできません。では定義されていません。IEnumerable<T>のメンバーですEnumerable

GetEnumerator()そのため、スタブをスタブしてIEnumerable<T>スタブを返す必要があります。これにより、必要なIEnumerator<T>タイプのスタブが返されます。

IEnumerator<T> enumerator = MockRepository.GenerateStub<IEnumerator<T>>();
enumerator.Stub(x => x.MoveNext()).Return(true);
enumerator.Stub(x => x.Current).Return(MockRepository.GenerateStub<T>());
enumerator.Stub(x => x.MoveNext()).Return(false);

IEnumerable<T> collection = MockRepository.GenerateStub<IEnumerable<T>>();
collection.Stub(x => x.GetEnumerator()).Return(enumerator);

ただし、モックを作成しないことを強くIEnumerableお勧めします。単一のアイテムでを使用するList<>と、最初にコーディングして後で読むのがはるかに簡単になり、脆弱性も大幅に軽減されます。

List<T> listOfT = new List<T>
{
    MockRepository.GenerateStub<T>()
};

コレクション インターフェイス タイプをスタブ/モック化するのは本当に悪い考えです。必ずインターフェイスを使用しますが、実際のコレクションを使用してテストに戻します。

于 2013-09-25T11:46:23.337 に答える