【发布时间】:2013-01-24 12:20:26
【问题描述】:
我正在尝试为如下所示的方法编写单元测试:
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():
预计至少会在模拟上调用一次,但从来没有 执行:
r => r.Create(It.Is<IEnumerable'1>(list => VerifyList(list)))执行的调用:
IRepo.Create(System.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32])
由于调用的类型不是IEnumerable<int> 而实际上是System.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32]),因此测试失败。 (逐步测试,一切正常,结果符合预期)
如果我在被测方法中调用ids.ToList(),结果如下:
预期至少对模拟调用一次,但从未执行:
r => r.Create(It.Is<List'1>(l => VerifyList(l)))执行的调用:
IRepo.Create(System.Collections.Generic.List'1[System.Int32])
有没有办法解决这个问题?还是我做错了什么?
编辑:原来我的 VerifyList 方法有误,所以它返回 false,但 Moq 没有给我该信息。类型差异是一个红鲱鱼..
【问题讨论】:
标签: c# unit-testing moq