Перемешивание - PullRequest
       19

Перемешивание

0 голосов
/ 27 апреля 2018

Я пытаюсь получить вызов на WriteAsync издеваться над макетом HttpResponse, и я не могу понять синтаксис для использования.

var responseMock = new Mock<HttpResponse>();
responseMock.Setup(x => x.WriteAsync(It.IsAny<string>(), It.IsAny<CancellationToken>()));

ctx.Setup(x => x.Response).Returns(responseMock.Object);

Испытание бомб со следующей ошибкой:

System.NotSupportedException: неверная настройка для метода расширения: x => x.WriteAsync (It.IsAny (), It.IsAny ())

В конечном итоге я хочу убедиться, что в ответ была записана правильная строка.

Как правильно настроить это?

1 Ответ

0 голосов
/ 27 апреля 2018

Moq не может Setup методы расширения. Если вы знаете, к чему обращается метод расширения, то в некоторых случаях вы можете смоделировать безопасный путь с помощью метода расширения.

WriteAsync (HttpResponse, String, CancellationToken)

Записывает данный текст в тело ответа. Будет использоваться кодировка UTF-8.

напрямую обращается к HttpResponse.Body.WriteAsync, где Body - это Stream через следующую перегрузку

/// <summary>
/// Writes the given text to the response body using the given encoding.
/// </summary>
/// <param name="response">The <see cref="HttpResponse"/>.</param>
/// <param name="text">The text to write to the response.</param>
/// <param name="encoding">The encoding to use.</param>
/// <param name="cancellationToken">Notifies when request operations should be cancelled.</param>
/// <returns>A task that represents the completion of the write operation.</returns>
public static Task WriteAsync(this HttpResponse response, string text, Encoding encoding, CancellationToken cancellationToken = default(CancellationToken))
{
    if (response == null)
    {
        throw new ArgumentNullException(nameof(response));
    }

    if (text == null)
    {
        throw new ArgumentNullException(nameof(text));
    }

    if (encoding == null)
    {
        throw new ArgumentNullException(nameof(encoding));
    }

    byte[] data = encoding.GetBytes(text);
    return response.Body.WriteAsync(data, 0, data.Length, cancellationToken);
}

Это означает, что вам понадобится макет response.Body.WriteAsync

//Arrange
var expected = "Hello World";
string actual = null;
var responseMock = new Mock<HttpResponse>();
responseMock
    .Setup(_ => _.Body.WriteAsync(It.IsAny<byte[]>(),It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()))
    .Callback((byte[] data, int offset, int length, CancellationToken token)=> {
        if(length > 0)
            actual = Encoding.UTF8.GetString(data);
    })
    .ReturnsAsync();

//...code removed for brevity

//...
Assert.AreEqual(expected, actual);

Обратный вызов использовался для захвата аргументов, передаваемых проверенному члену. Его значение было сохранено в переменной, которая будет утверждена позже в тесте.

...