代码之家  ›  专栏  ›  技术社区  ›  Adam

无法将异步lambda表达式转换为委托

  •  1
  • Adam  · 技术社区  · 6 年前

    我正在为MS Bot对话框设置单元测试,并收到以下错误,不确定如何解决。有人能帮忙吗?谢谢

    错误CS4010无法将异步lambda表达式转换为委托类型' Task<HttpOperationResponse<BotData>> '.异步lambda表达式可能返回void、task或 Task<T> ,其中任何一个都不能转换为' 任务<httpOperationResponse<botdata>> '. d3directlinebot.unittests c:\repos\d3directlinebot\d3directlinebot.unittests\mockconnectorfactory.cs 109活动

    模拟课堂

    public Mock<StateClient> MockIBots(MockConnectorFactory mockConnectorFactory)
    {
        var botsClient = new Moq.Mock<StateClient>(MockBehavior.Loose);
    
        botsClient.Setup(d => d.BotState.SetConversationDataWithHttpMessagesAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<BotData>(), It.IsAny<Dictionary<string, List<string>>>(), It.IsAny<CancellationToken>()))
            .Returns<string, string, BotData, Dictionary<string, List<string>>, CancellationToken>(async (channelId, conversationId, data, headers, token) =>
            {
                return await mockConnectorFactory.UpsertData(channelId, null, conversationId, BotStoreType.BotConversationData, data);
            });
    
            return botsClient;
        }
    

    upsertData类

    protected async Task<HttpOperationResponse<object>> UpsertData(string channelId, string userId, string conversationId, BotStoreType storeType, BotData data)
    {
        var _result = new HttpOperationResponse<object>();
        _result.Request = new HttpRequestMessage();
        try
        {
            var address = AddressFrom(channelId, userId, conversationId);
            await memoryDataStore.SaveAsync(address, storeType, data, CancellationToken.None);
        }
        catch (HttpException e)
        {
            _result.Body = e.Data;
            _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.PreconditionFailed };
            return _result;
        }
        catch (Exception)
        {
            _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.InternalServerError };
            return _result;
        }
        _result.Body = data;
        _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
        return _result;
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Dmitry Bogatykh    6 年前

    您只需返回任务而不等待它:

    return mockConnectorFactory.UpsertData(channelId, null, conversationId, BotStoreType.BotConversationData, data);
    
        2
  •  0
  •   Adam    6 年前

    upsertData类 :更改 HttpOperationResponse<object> HttpOperationResponse<Botdata>

    protected async Task<HttpOperationResponse<Botdata>> UpsertData(string channelId, string userId, string conversationId, BotStoreType storeType, BotData data)
    {
        var _result = new HttpOperationResponse<Botdata>();
        _result.Request = new HttpRequestMessage();
        try
        {
            var address = AddressFrom(channelId, userId, conversationId);
            await memoryDataStore.SaveAsync(address, storeType, data, CancellationToken.None);
        }
        catch (HttpException e)
        {
            _result.Body = data;
            _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.PreconditionFailed };
            return _result;
        }
        catch (Exception)
        {
            _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.InternalServerError };
            return _result;
        }
        _result.Body = data;
        _result.Response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
        return _result;
    }
    

    MockConnectionFactory类 :已删除 async await 如@dmitrybogatykh所述

        botsClient.Setup(d => d.BotState.SetConversationDataWithHttpMessagesAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<BotData>(), It.IsAny<Dictionary<string, List<string>>>(), It.IsAny<CancellationToken>()))
            .Returns((string channelId, string conversationId, BotData data, Dictionary<string, List<string>> headers, CancellationToken token) =>
            {
                return  mockConnectorFactory.UpsertData(channelId, null, conversationId, BotStoreType.BotConversationData, data);
            });