#c# #unit-testing
Вопрос:
Я пытаюсь написать модульный тест для приведенного ниже метода, но я получаю ошибку, поскольку this
для объекта установлена нулевая ссылка в случае аргументов this.Request.Body
и this.Request.Headers
. Каким будет решение для насмешек _azureDevopsTask.PublishToHandler(this.Request.Body, this.Request.Headers)
?
В настоящее время я использую платформу Moq для написания модульных тестов. Где _azureDevopsTask
находится объект другого класса, который используется здесь с помощью внедрения зависимостей.
[HttpPost]
public IActionResult Execute()
{
try
{
_azureDevopsTask.PublishToHandler(this.Request.Body, this.Request.Headers);
return CreateSuccessResponse(true);
}
catch (Exception ex)
{
return CreateErrorResponse(ex.Message);
}
}
Комментарии:
1. Ты
NullReferenceException
к чему клонишьthis.Request.Body
? Что вы пытаетесь провести модульный тест? Что это за тип_azureDevopsTask
?2. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.
Ответ №1:
На самом деле, вам не нужно Moq для насмешки над запросом, и вы можете использовать DefaultHttpContext
вместо этого:
var httpContext = new DefaultHttpContext();
Установите тело:
var stream = new MemoryStream(Encoding.UTF8.GetBytes("{example: value}"));
httpContext.Request.Body = stream;
httpContext.Request.ContentLength = stream.Length;
Настройка заголовков:
httpContext.Request.Headers["Content-Type"] = "application/json";
Настройте макет HttpContext в контроллере:
var controller = new ExampleController()
{
ControllerContext = new ControllerContext()
{
HttpContext = httpContext,
}
};
Комментарии:
1. Мне очень жаль, но это не работает. Я сталкиваюсь с той же проблемой.
2. Вот как издеваться над запросом, и он работает (я дважды проверил). Что именно такое null? В случае, если у вас есть исключение не по запросу, а
_azureDevopsTask
вместо этого, вам следует_azureDevopsTask
вместо этого посмеяться и просто подтвердить вызов.