簡體   English   中英

如何模擬返回Task <IList <>>的方法?

[英]How can I mock a method that returns a Task<IList<>>?

我試圖單元測試一個返回任務>的方法:

void Main()
{
    var mockRepo = new Mock<IRepository>();
    mockRepo.Setup(x => x.GetAll()).Returns(new List<MyModel>() { new MyModel { Name = "Test" } });  // works

    mockRepo.Setup(x => x.GetAllAsync()).Returns(Task.FromResult(new List<MyModel>() { new MyModel { Name = "Test" } }));  // error

    var result = mockRepo.Object.GetAll();
    result.Dump();
}

public interface IRepository
{
    Task<IList<MyModel>> GetAllAsync();
    IList<MyModel> GetAll();
}

public class MyModel
{
    public string Name { get; set; }
}

但Task返回方法會生成編譯器錯誤:

CS1503參數1:無法從'System.Threading.Tasks.Task <System.Collections.Generic.List <UserQuery.MyModel>'轉換為'System.Threading.Tasks.Task <System.Collections.Generic.IList <UserQuery.MyModel >”

我究竟做錯了什么?

您可以使用ReturnsAync方法:

IList<MyModel> expected = new List<MyModel>() { new MyModel { Name = "Test" }};
mockRepo.Setup(x => x.GetAll()).ReturnsAsync(expected);

很快就發布了,發現Moq有ReturnsAsync方法。

mockRepo.Setup(x => x.GetAllAsync()).ReturnsAsync((new List<MyModel>() { new MyModel { Name = "Test" } });  

工作良好。

只需將您的列表轉發給IList:

Task.FromResult((IList<MyModel>) new List<MyModel>() { new MyModel { Name = "Test" } })

或者定義通用參數:

Task.FromResult<IList<MyModel>>(new List<MyModel>() { new MyModel { Name = "Test" } })

將結果轉換為IList

Task.FromResult((IList)new List() { new MyModel { Name = "Test" } });

那么你的問題是你的方法應該返回Task<IList>並且你正在返回Task<List>你不能這樣做 - 它們是不同的類型,它們不支持逆變或協方差。 你需要轉換你的返回類型

 mockRepo.Setup(x => x.GetAllAsync()).Returns(Task.FromResult((IList<MyModel>)new List<MyModel>() { new MyModel { Name = "Test" } }));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM