次のようなメソッドの単体テストを作成しようとしています。
public int Save(IEnumerable<int> addedIds, IEnumerable<int> removedIds)
{
var existingIds = repository.Get();
IEnumerable<int> ids = existingIds.Except(removedIds).Union(addedIds));
return repository.Create(ids);
}
Moq でのテストは次のようになります。
repository.Setup(r => r.Get()).Returns(CreateList());
service.Save(addedIds, removedIds);
repository.Verify(r => r.Create(It.Is<IEnumerable<int>>(l => VerifyList(l))));
これは次のエラーで失敗し、VerifyList()
呼び出されません。
モックで少なくとも 1 回の呼び出しが期待されていましたが、実行されませんでした:
r => r.Create(It.Is<IEnumerable'1>(list => VerifyList(list)))
実行された呼び出し:
IRepo.Create(System.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32])
呼び出された型は is ではなくIEnumerable<int>
、実際には is であるSystem.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32])
ため、テストは失敗します。(テストをステップ実行すると、すべてが正しく行われ、結果は期待どおりです)
ids.ToList()
テスト対象のメソッドを呼び出すと、次の結果が得られます。
モックで少なくとも 1 回の呼び出しが期待されていましたが、実行されませんでした:
r => r.Create(It.Is<List'1>(l => VerifyList(l)))
実行された呼び出し:
IRepo.Create(System.Collections.Generic.List'1[System.Int32])
これを回避する方法はありますか?それとも私は何か間違ったことをしていますか?
編集:VerifyListメソッドに誤りがあったことが判明したため、falseが返されましたが、Moqはその情報を提供していませんでした。種類の違いはアカニシンです。