使用 select 模拟 (moq) GetAllAsync linq 查询
Mocking (moq) a GetAllAsync linq query with select
这是我需要模拟的特定代码行。
IGenericRepository<Foo> _fooRepository;
var listOfIds = await _fooRepository.GetAllAsync(o => o.Ids);
这是获取一个 int 列表来表示此数据中的 ID table。也就是说,
select Ids from Table
FooRepository 是通过 IGenericRepository 实现的,全部使用实体框架。底层 table 中的 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 仍然为空。
我有点卡在这个上面了。我唯一能想到的就是将这行代码粘贴到辅助方法中并模拟辅助方法。但是为了通过测试而重写代码似乎是一种非常糟糕的方法。
您不必为 Returns 方法调用指定参数。 Moq 还包括另一种设置异步方法结果的方法。
_fooRepositoryMock.Setup(o => o.GetAllAsync(It.IsAny<Expression<Func<Foo, int>>>()))
.ReturnsAsync(idList);
这是我需要模拟的特定代码行。
IGenericRepository<Foo> _fooRepository;
var listOfIds = await _fooRepository.GetAllAsync(o => o.Ids);
这是获取一个 int 列表来表示此数据中的 ID table。也就是说,
select Ids from Table
FooRepository 是通过 IGenericRepository 实现的,全部使用实体框架。底层 table 中的 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 仍然为空。
我有点卡在这个上面了。我唯一能想到的就是将这行代码粘贴到辅助方法中并模拟辅助方法。但是为了通过测试而重写代码似乎是一种非常糟糕的方法。
您不必为 Returns 方法调用指定参数。 Moq 还包括另一种设置异步方法结果的方法。
_fooRepositoryMock.Setup(o => o.GetAllAsync(It.IsAny<Expression<Func<Foo, int>>>()))
.ReturnsAsync(idList);