如何从同步代码中返回任务以进行模拟实现

Posted

技术标签:

【中文标题】如何从同步代码中返回任务以进行模拟实现【英文标题】:How to return a task from synchronous code for a mock implementation 【发布时间】:2019-09-11 11:25:26 【问题描述】:

我对异步等待几乎没有经验。

我正在尝试为从数据库返回数据的服务创建一个模拟。

具体的服务类可能会比较慢,所以界面返回Task如下图:

public interface IReferenceDataService
    
        Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept);
    

我的模拟类如下所示:

public class MockReferenceDataService : IReferenceDataService

    public async Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept)
    
        List<ReferenceDataResults> ret = new List<ReferenceDataResults>();

        var refDataRepo = new List<ReferenceDataResults>()
        
            new ReferenceDataResults Domain = "Interfaces.Avaloq", Concept = "Client", Key1 = "CE", Value1 = "2", Key2 = "Avaloq", Value2 = "Individual" ,
             new ReferenceDataResults Domain = "Interfaces.Avaloq", Concept = "Client", Key1 = "CE", Value1 = "3", Key2 = "Avaloq", Value2 = "Joint"  

        ;

        var found = refDataRepo.FindAll(x => x.Domain == domain && x.Concept == concept);

        foreach (var row in found)
        
            ret.Add(new ReferenceDataResults()  Concept = row.Concept,
                Domain = row.Domain, Key1 = row.Key1, Key2 = row.Key2, Value1 = row.Value1, Value2 = row.Value2 );
        

        return ret;
    

这会给出编译器警告,因为它被标记为“异步”但缺少“等待”。 我猜最接近数据库检索的是 List 上的 FindAll 方法,但似乎没有我可以“等待”的 FindAll 的异步版本。

解决此问题的最佳方法是什么?

【问题讨论】:

将return语句更改为return await Task.FromResult(ret);。您可以在here阅读有关Task.FromResult的详细信息 @user1672994 我建议丢失asyncawait,只使用return Task.FromResult(ret); 【参考方案1】:

由于async 不构成界面的一部分,请尝试将其删除:

public class MockReferenceDataService : IReferenceDataService

    public Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept)
    
        // Your code
        return Task.FromResult(ret);
    

【讨论】:

以上是关于如何从同步代码中返回任务以进行模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

如何通过模拟同步进行 d3 更新

如何清除 Jest 模拟实现以进行下一次测试?

模拟实现memmove函数

如何在 iOS 设备上模拟磁盘空间不足的情况?

java模拟实现两部电梯同时工作的高效算法

如何使用Qt进行post get模拟登录