【发布时间】:2015-11-10 16:16:24
【问题描述】:
这是我需要模拟的特定代码行。
IGenericRepository<Foo> _fooRepository;
var listOfIds = await _fooRepository.GetAllAsync(o => o.Ids);
这是获取一个 int 列表来表示此数据表中的 ID。换句话说,
select Ids from Table
FooRepository 是通过 IGenericRepository 实现的,全部使用实体框架。基础表中的 Ids 字段只是整数值,我试图从中获取一个 int 列表。我不想要任何其他列。
所以我尝试了以下方法无济于事:
1.
_listOfIds = new List<int> {1,2,3,4,5};
_fooRepositoryMock.Setup(o => o.GetAllAsync(
It.IsAny<Expression<Func<Foo, bool>>>()))
.Returns((Expression<Func<Foo, bool>> Predicate) =>
Task.FromResult(_listOfids.Where(Predicate.Compile()).ToList()
as ICollection<int>));
有了这个,IntelliSense 抱怨它无法从...进行转换
'System.Func<Foo, Bool> to System.Func<int, int, bool>"
我一开始尝试处理进出 Func 委托的不同类型。但我仍然遇到同样的错误。
2.
然后我尝试只使用默认值,因为我并不特别介意它是否完全测试该行。 ID 列表稍后将在该方法中使用。但我需要模拟它,因为如果它为 null,则会导致测试方法进一步失败。
_listOfids= new List<int> {1,2,3,4,5};
_fooRepositoryMock.SetReturnsDefault(_listOfIds);
由于某种原因,在调试时 listOfIds 仍然为空。
我有点坚持这个。我唯一能想到的就是将这行代码粘贴到辅助方法中,然后模拟辅助方法。但是为了通过测试而重写代码似乎是一种非常糟糕的方式。
【问题讨论】:
标签: linq unit-testing automated-tests moq