如何Moq设置等待与ToListAsync变量已经查询为iquritable ?



变量为IQueryable类型列表,

var requests = _genericRepository.GetIQueryable<RequestMaster>();

所以对于上面的代码行,我下面的模拟设置工作得很好

private IEnumerable<RequestMaster> FakeRequestMaster()
{
string fakeData = @"[{
'RequestId': '118',
'RequestUuid':'901358ab-32e3-4a52-9182-ba68a0a03b50',
'UserId':'klj123kj-0120-4f3c-8d29-asd213klj213lkl',
'StatusId':'7',
'CreatedOn':'11/28/2021 10:01:42 AM',
'CreatedBy':'000000-0000-0000-0000-000000000000',
'ModifiedOn':'3/23/2022 6:30:31 PM',
'ModifiedBy':'000000-0000-0000-0000-000000000000'
'IsActive':'true',
}]";
return JsonConvert.DeserializeObject<IEnumerable<RequestMaster>>(fakeData);
}
[Fact]
public async Task GetRequests_SendingValidId_ExpectedNotNull()
{
var fakeRequestMaster = FakeRequestMaster();
_mockGenericRepository.Setup(s => s.GetIQueryable<RequestMaster>()).Returns(fakeRequestMaster.AsQueryable);
var result = await service.GetRequests(typeId);

// Assert
Assert.NotNull(result);
}

但是在通过'await'和'ToListAsync'获得一些数据后,然后在这一步测试编译器跳过执行并抛出错误:

系统。InvalidCastException:无法强制转换类型为System.Linq.EnumerableQuery 1的对象[tmo . mwave . data . microwavemodels。][/p] .

所以,我尝试了在这个链接中提到的:如何用实体框架核心模拟异步存储库

var mockSetDb = new Mock<DbSet<RequestMaster>>();
mockSetDb.As<IAsyncEnumerable<RequestMaster>>().Setup(m => m.GetEnumerator()).Returns(new TestAsyncEnumerator<RequestMaster>(fakeRequestMaster.GetEnumerator()));
mockSetDb.As<IQueryable<RequestMaster>>().Setup(m => m.Provider).Returns(new TestAsyncQueryProvider<RequestMaster>(fakeRequestMaster.Provider));
mockSetDb.As<IQueryable<RequestMaster>>().Setup(m => m.Expression).Returns(fakeRequestMaster.Expression);
mockSetDb.As<IQueryable<RequestMaster>>().Setup(m => m.ElementType).Returns(fakeRequestMaster.ElementType);
mockSetDb.As<IQueryable<RequestMaster>>().Setup(m => m.GetEnumerator()).Returns(() => fakeRequestMaster.GetEnumerator());

所以这也不工作,得到问题:

' iasyncenumerator '不包含'GetEnumerator'的定义,并且无法找到接受' iasyncenumerator '类型的第一个参数的可访问扩展方法'GetEnumerator'(您是否缺少using指令或程序集引用?)

'IEnumerable'不包含'Provider'的定义,并且无法找到接受'IEnumerable'类型的第一个参数的可访问扩展方法'Provider'(您是否缺少using指令或程序集引用?)

'IEnumerable'不包含'Expression'的定义,并且无法找到接受'IEnumerable'类型的第一个参数的可访问扩展方法'Expression'(您是否缺少using指令或程序集引用?)

'IEnumerable'不包含'ElementType'的定义,并且无法找到接受'IEnumerable'类型的第一个参数的可访问扩展方法'ElementType'(您是否缺少using指令或程序集引用?)

所以,请任何人帮助我Moq设置等待与ToListAsync变量。

通过安装MockQueryable。Moq 5.0软件包

使用MockQueryable.Moq;

var requestMaster = RequestMaster();
var mock = requestMaster.BuildMock();
_mockGenericRepository.Setup(s => s.GetIQueryable<RequestMaster>()).Returns(mock);

工作好。

最新更新