Сбой модульного теста при моделировании асинхронного метода, c # - PullRequest
0 голосов
/ 18 января 2019

Я смоделировал асинхронную функцию, но всякий раз, когда я вызываю смоделированную функцию, она возвращает нулевое значение.

У меня есть асинхронная функция, как показано ниже

public async Task<TResult> InvokeAzureFunctionWithTokenGetResultAsync<TArg, TResult>(TArg arg, string functionUri, string resourceid, CancellationToken canceltoken)

Я хочу написать тестовый пример xUnit, так как я не могу выполнить реальную функцию, я пытаюсь ее смоделировать. при выполнении нет ошибки, но когда вызывается функция, я получаю нулевое значение.

Фактическая функция

public async Task<TResult> InvokeAzureFunctionWithTokenGetResultAsync<TArg, TResult>(TArg arg, string functionUri, string resourceid, CancellationToken canceltoken)
{
    // some external code here

    if (message != null && (message.StatusCode == HttpStatusCode.OK || message.StatusCode == HttpStatusCode.Created))
    {
        try
        {
            return JsonConvert.DeserializeObject<TResult>(await message.Content.ReadAsStringAsync().ConfigureAwait(true));
        }
        catch (JsonReaderException re)
        {
            throw new FormatException(re.Message, re);
        }
        catch (FormatException fe)
        {
            throw new FormatException(fe.Message, fe);
        }
    }
    else if (message != null)
    {
        throw new FormatException(message.ReasonPhrase);
    }

    return default(TResult);
}

Проверка функции

IHttpEndpointInvoker httpEndpointInvoker = new HttpEndpointInvoker();

IHttpEndpointInvoker httpEndpointInvoker = new HttpEndpointInvoker();

try
{
    var mock = new Mock<IHttpEndpointInvoker>();

    var obj = (new RouteDefinition() { Id = routeDefinitionId, IoTHubId = "" });

    mock.Setup(s => s.InvokeAzureFunctionWithTokenGetResultAsync<RouteDefinition, string>(It.IsIn<RouteDefinition>(), It.IsAny<string>(), It.IsAny<string>(), new CancellationTokenSource().Token)).Returns(Task.Factory.StartNew(() => GetHttpResponseMessage(HttpStatusCode.Accepted).Result));

    var o1 = mock.Object.InvokeAzureFunctionWithTokenGetResultAsync<RouteDefinition, string>(obj, "functionUri", "resourceid", new CancellationTokenSource().Token).GetAwaiter().GetResult(); // this line is returning null. But I am expecting value that is returned by "GetHttpResponseMessage" function


}
catch (Exception ex)
{

    throw;
}

Примечание: «GetHttpResponseMessage» успешно вызывается и возвращает строку. Я отладил это.

Пожалуйста, проверьте строку с комментариями ниже, приведенными в приведенном выше коде для ожидаемых результатов / результатов.

// эта строка возвращает ноль. Но я ожидаю, что значение, возвращаемое функцией GetHttpResponseMessage, будет возвращено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...