C# 使用MOQ的模拟异步Get方法

C# 使用MOQ的模拟异步Get方法,c#,.net,async-await,moq,C#,.net,Async Await,Moq,如何消除此错误消息: Error 5 Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<TGB.Business.DTO.SchoolyearDTO>>' to 'System.Collections.Generic.IEnumerable<TGB.Business.DTO.SchoolyearDTO>'.

如何消除此错误消息:

Error   5   Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<TGB.Business.DTO.SchoolyearDTO>>' to 'System.Collections.Generic.IEnumerable<TGB.Business.DTO.SchoolyearDTO>'. An explicit conversion exists (are you missing a cast?)   
错误5无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(是否缺少强制转换?)
我以为我的任务。FromResult会解决这个问题,但没有

mockService.Setup<IEnumerable<SchoolyearDTO>>(c => c.GetSchoolyears()).Returns(
                    Task.FromResult(Enumerable.Empty<SchoolyearDTO>()));

public async Task<IEnumerable<SchoolyearDTO>> GetSchoolyearsAsync()
{
    var schoolyears = await ...
}
mockService.Setup(c=>c.GetSchoolyears())。返回(
Task.FromResult(Enumerable.Empty());
公共异步任务GetSchoolyearsAsync()
{
var schoolyears=等待。。。
}

GetSchoolyearsAsync
是一种异步方法,因此它返回一个
任务
,而不仅仅是一个
IEnumerable
。您需要在
SetupGet

mockService.SetupGet<Task<IEnumerable<SchoolyearDTO>>>(c => c.GetSchoolyears()).
    Returns(Task.FromResult(Enumerable.Empty<SchoolyearDTO>()));
mockService.SetupGet(c=>c.GetSchoolyears()。
返回(Task.FromResult(Enumerable.Empty());

您正在将任务返回给不接受任务的对象。您需要更改模拟或方法。不接受吗?但是我的GetSchoolyears正在等待任务?请查看我的答案以获得解释。现在我得到了错误:非虚拟(在VB中可重写)成员上的设置无效:c=>c.GetSchoolyearsAsync()从何时开始我必须使用MOQ使我的方法虚拟?@Elisa你确定GetSchoolyearsAsync和GetSchoolyears是同一个方法吗?我做了重命名。。。是的,只有xxxAsync存在!好的,我必须使用虚拟的原因是因为MOQ不能模拟除接口成员以外的非虚拟成员。这是我第一次使用无接口lol。。。所以我走进了那个。。。