【问题标题】:ISetup<IDurableOrchestrationContext, Task<List<string>> does not contain a definition for 'ReturnsAsync'ISetup<IDurableOrchestrationContext, Task<List<string>> 不包含“ReturnsAsync”的定义
【发布时间】:2020-06-26 00:08:28
【问题描述】:

我从 Durable Azure Functions(最新版本)开始,它是单元测试(使用 x-unit)。下面是我的触发函数(http触发):

[FunctionName("funcEventSubscriber")]
public async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    try
    {
        string instanceId = await starter.StartNewAsync("funcEventOrchestrator", null);
        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
        return starter.CreateCheckStatusResponse(req, instanceId);
    }
    catch (System.Exception ex)
    {
        _telemetryHelper.LogException(ex);
        throw;
    }
}

这是我的协调器功能,它启动了活动功能:

[FunctionName("funcEventOrchestrator")]
public async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    try
    {
        var outputs = new List<string>();
        var reusultSet = new List<string>();
        outputs = await context.CallActivityAsync<List<string>>("funcActivityA", "");
        foreach (var item in outputs)
        {
            var result = await context.CallActivityAsync<List<TableRegionEntity>>("funcActivityB", item);
            if (result.Count > 0)
            {
                foreach (var data in result)
                {
                    List<string> inputObject = new List<string>();
                    inputObject.Add(data.Subscriber);
                    inputObject.Add(item);
                    reusultSet.Add(await context.CallActivityAsync<string>("funcActivityC", inputObject));
                }
            }
            else
            {
                reusultSet.Add(await context.CallActivityAsync<string>("funcActivityD", item));
            }
        }
        return reusultSet;
    }
    catch (System.Exception ex)
    {
        _telemetryHelper.LogException(ex);
        throw;
    }
}

我为我的编排函数编写的单元测试方法如下所示:

[Fact]
public async Task Run_returns_list_of_string()
{
    var mockContext = new Mock<IDurableOrchestrationContext>();
    mockContext.Setup(x => x.CallActivityAsync<List<string>>("funcActivityA", "")).ReturnsAsync(funcActivityAOutput);
    mockContext.Setup(x => x.CallActivityAsync<List<TableRegionEntity>>("funcActivityB", inputJsonString)).ReturnsAsync(funcActivityBOutput);
    mockContext.Setup(x => x.CallActivityAsync<string>("funcActivityC", funcActivityCInputObject)).ReturnsAsync(funcActivityCOutput);
    mockContext.Setup(x => x.CallActivityAsync<string>("funcActivityD", inputJsonString)).ReturnsAsync(funcActivityDOutput);

    // Instantiate funcEventSubscriber
    funcEventSubscriber funcEventSubscriberObj = new funcEventSubscriber(telemetryHelperMock.Object);

    // Act
    var result = await funcEventSubscriberObj.RunOrchestrator(mockContext.Object); // call orchestrator fn

    // Assert
    Assert.Equal(3, result.Count);
}

我设置mockContext 的方式会引发错误。这是mockContext.Setup 第一行的错误,即

mockContext.Setup(x => x.CallActivityAsync<List<string>>("funcActivityA", "")).ReturnsAsync(funcActivityAOutput);`

我哪里错了?

【问题讨论】:

    标签: c# unit-testing azure-functions moq azure-durable-functions


    【解决方案1】:

    在您的设置中,假设被模拟的成员定义为

    ,假设该行返回List&lt;string&gt;

    IDurableOrchestrationContext.CallActivityAsync&lt;TResult&gt;(String, Object) Method

    public Task<TResult> CallActivityAsync<TResult> (string functionName, object input);
    

    在哪里

    TResult:计划活动函数的返回类型。

    确保为被模拟的成员使用了正确的返回类型。这样就可以在设置中调用正确的ReturnsAsync 扩展

    例如

    //...
    
    List<string> funcActivityAOutput = new List<string>() {
        //...populate list as needed
    }
    var mockContext = new Mock<IDurableOrchestrationContext>();
    mockContext
        .Setup(x => x.CallActivityAsync<List<string>>("funcActivityA", ""))
        .ReturnsAsync(funcActivityAOutput);
    
    //...
    

    【讨论】:

    • 是的,你是对的,我混淆了“TResult”和我在“mockContext”的“ReturnsAsync”中指定的返回类型。虽然我将前者指定为“”,但我错误地将后者设置为“Task>”,因此出现了错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多