Я пытаюсь использовать NSubstitute для имитации HttpClient. Вот код:
public static HttpClient GetHttpClient(bool isSucess = true, string methodType = "GET")
{
var mockIHttpMessageHandler = Substitute.For();
var mockHttpMessageHandler = Substitute.For(mockIHttpMessageHandler);
var httpResponse = Substitute.For();
httpResponse.Content = new StringContent("\"test\"");
if (isSucess)
httpResponse.StatusCode = HttpStatusCode.OK;
else
httpResponse.StatusCode = HttpStatusCode.NotFound;
var mockHttpClient = Substitute.For(mockHttpMessageHandler);
mockHttpClient.BaseAddress = new Uri("http://localhost");
if(methodType != "POST"){
mockHttpClient.GetAsync(Arg.Any()).ReturnsForAnyArgs(httpResponse);
}
return mockHttpClient;
}
Однако в этой строке возникла ошибка:
mockHttpClient.GetAsync(Arg.Any()).ReturnsForAnyArgs(httpResponse);
И ошибка:
NSubstitute.Exceptions.RedundantArgumentMatcherException: 'Некоторые
спецификации аргументов (например, Arg .Is, Arg.Any) остались после
последнего вызова.
Это часто происходит из-за использования спецификации аргумента с вызовом члена
NSubstitute не обрабатывает (например, невиртуальный член или вызов
экземпляра, который не является заменой) или для других целей, кроме
определения вызова (например, использование аргумента spec в качестве возвращаемого значения). Для
примера:
var sub = Substitute.For();
var realType = new MyRealType(sub);
// INCORRECT, arg spec used on realType, not a substitute:
realType.SomeMethod(Arg.Any()).Returns(2);
// INCORRECT, arg spec used as a return value, not to specify a call:
sub.VirtualMethod(2).Returns(Arg.Any());
// INCORRECT, arg spec used with a non-virtual method:
sub.NonVirtualMethod(Arg.Any()).Returns(2);
// CORRECT, arg spec used to specify virtual call on a substitute:
sub.VirtualMethod(Arg.Any()).Returns(2);
Чтобы это исправить, убедитесь, что вы используете спецификации аргументов только с вызовами
подстановок. Если вашей заменой является класс, убедитесь, что этот член является
виртуальным.
Другая возможная причина заключается в том, что тип спецификации аргумента не соответствует
фактическому типу аргумента, но код компилируется из-за неявного приведения.
Например, использовался Arg.Any(), но
требовался Arg.Any().
ПРИМЕЧАНИЕ: причина этого исключения может быть в ранее выполнил
тест. Используйте диагностику ниже, чтобы увидеть типы любых избыточных спецификаций аргументов, а затем выяснить, где они создаются.
Диагностическая информация:
Спецификации остальных (несвязанных) аргументов:
любой Uri
Спецификации всех аргументов:
любой Uri
Они предполагают, что мне нужно изменить метод getAsync? Для GetAsync нет виртуального метода.
Изменить:
Я также пытался удалить NSubstitute для HttpClient следующим образом, но все равно получил та же ошибка:
public static HttpClient GetHttpClient(bool isSucess = true, string methodType = "GET")
{
var mockIHttpMessageHandler = Substitute.For();
var mockHttpMessageHandler = Substitute.For(mockIHttpMessageHandler);
var httpResponse = Substitute.For();
httpResponse.Content = new StringContent("\"test\"");
if (isSucess)
httpResponse.StatusCode = HttpStatusCode.OK;
else
httpResponse.StatusCode = HttpStatusCode.NotFound;
var httpClient = new HttpClient(mockHttpMessageHandler);
httpClient = new Uri("http://localhost");
if(methodType != "POST"){
httpClient .GetAsync(Arg.Any()).ReturnsForAnyArgs(httpResponse);
}
return httpClient
}
Подробнее здесь: https://stackoverflow.com/questions/686 ... substitute
Как имитировать HttpClient с помощью NSubstitute ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение