NSubstitute для защищенных методовC#

Место общения программистов C#
Ответить
Anonymous
 NSubstitute для защищенных методов

Сообщение Anonymous »

Я переношу существующие модульные тесты с Moq на NSubstitute.
В большинстве случаев это был очень плавный переход, но когда дело доходит до имитации HttpMessageHandler (SendAsync), существует довольно удобный способ перейти к частному методу moq.
(предыдущий пример для минимального заказа для настройки возврата с выражениями аргументов)

Код: Выделить всё

protected void SetupHandler(Expression match, HttpStatusCode httpStatusCode,
T body)
{
SetupHandlerStringResponse(match, httpStatusCode, JsonConvert.SerializeObject(
body), "application/json");
}

protected void SetupHandlerStringResponse(Expression match, HttpStatusCode httpStatusCode,
string body, string contentType)
{
MockHttpMessageHandler.Protected()
.Setup("SendAsync", ItExpr.Is(match), ItExpr.IsAny())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = httpStatusCode,
Content = new StringContent(body, Encoding.UTF8, contentType)
});
}

protected void VerifyHandler(Expression match, Times times)
{
MockHttpMessageHandler.Protected().Verify("SendAsync", times, ItExpr.Is(match), ItExpr.IsAny());
}
с помощью SetupHandler и VerifyHandler я мог бы легко вызвать шаги настройки/проверки в своем коде следующим образом...

Код: Выделить всё

SetupHandler(t => t.Method == HttpMethod.Get, HttpStatusCode.OK, lookup);

var response = await Class.DoSomething();

Assert.NotNull(response);

VerifyHandler(t => t.Method == HttpMethod.Get && t.RequestUri.PathAndQuery == $"/api/endpointName", Times.Once());
Насколько мне известно, в NSubstitute нет прямого случая, который бы поддерживал это.
Я нашел в Интернете множество статей о подобных проблемах, и всегда кажется, что с параметрами возникают какие-то проблемы. Я несколько раз видел этот подход для замены этого «Защищенного» метода доступа.
Похоже, что этот способ будет работать, если не было параметров ИЛИ не требовалась проверка параметров.
Но в моем случае это бесполезно для меня, если я не могу использовать выражения Arg.Is для проверки входных данных и при этом имитировать выходные данные для HttpMessageHandler.
Любой Помощь/идеи будут признательны.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ed-methods
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»