ISetup не содержит определения для ReturnsAsyn c - PullRequest
1 голос
/ 14 марта 2020

Я начинаю с Durable Azure Функции (последняя версия) и его модульное тестирование (с использованием 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);`

enter image description here

Где я здесь ошибаюсь?

1 Ответ

1 голос
/ 14 марта 2020

В вашей настройке предполагается, что рассматриваемая строка возвращает List<string>, учитывая, что макетированный элемент определен как

IDurableOrchestrationContext.CallActivityAsync<TResult>(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);

//...
...