Как я могу издеваться над этим кодом для модульного тестирования с использованием Moq?

#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 вместо этого посмеяться и просто подтвердить вызов.