Значение не может быть нулевым. Имя параметра: запрос
Я создаю unit test с помощью nunit, и весь этот код отлично работает во время выполнения.
У меня есть этот защищенный код HttpResponseMessage
ниже, который вызывается моим контроллером, когда он возвращается.
Однако ошибка:
"Значение не может быть пустым. Отображается имя параметра: запрос".
И когда я проверяю запрос, это на самом деле null
.
Вопрос:
Как мне закодировать мой unit test, чтобы вернуть HttpResponseMessage
?
В этой строке отображается ошибка:
protected HttpResponseMessage Created<T>(T result) => Request.CreateResponse(HttpStatusCode.Created, Envelope.Ok(result));
Вот мой контроллер:
[Route("employees")]
[HttpPost]
public HttpResponseMessage CreateEmployee([FromBody] CreateEmployeeModel model)
{
//**Some code here**//
return Created(new EmployeeModel
{
EmployeeId = employee.Id,
CustomerId = employee.CustomerId,
UserId = employee.UserId,
FirstName = employee.User.FirstName,
LastName = employee.User.LastName,
Email = employee.User.Email,
MobileNumber = employee.MobileNumber,
IsPrimaryContact = employee.IsPrimaryContact,
OnlineRoleId = RoleManager.GetOnlineRole(employee.CustomerId, employee.UserId).Id,
HasMultipleCompanies = EmployeeManager.HasMultipleCompanies(employee.UserId)
});
}
Ответы
Ответ 1
Причина, по которой вы получаете:
Исключение типа "System.ArgumentNullException" произошло в System.Web.Http.dll, но не было обработано в коде пользователя Дополнительная информация: Значение не может быть нулевым.
заключается в том, что объект Request
null
.
![введите описание изображения здесь]()
Решением для этого является создание экземпляра вашего контроллера в ваших тестах, например:
var myApiController = new MyApiController
{
Request = new System.Net.Http.HttpRequestMessage(),
Configuration = new HttpConfiguration()
};
Таким образом, при создании нового экземпляра класса MyApiController
мы инициализируем объект Request
. Кроме того, также необходимо предоставить связанный объект конфигурации.
Наконец, примером Unit Test для вашего Api Controller может быть:
[TestClass]
public class MyApiControllerTests
{
[TestMethod]
public void CreateEmployee_Returns_HttpStatusCode_Created()
{
// Arrange
var controller = new MyApiController
{
Request = new System.Net.Http.HttpRequestMessage(),
Configuration = new HttpConfiguration()
};
var employee = new CreateEmployeeModel
{
Id = 1
};
// Act
var response = controller.CreateEmployee(employee);
// Assert
Assert.AreEqual(response.StatusCode, HttpStatusCode.Created);
}
}
Ответ 2
Я думаю, что происходит то, что вы не создаете экземпляр или не назначаете свойство Request (HttpRequestMessage
) при обновлении своего контроллера. Я считаю обязательным указывать запрос до вызова метода Api через ваш unit test.
Вам также может потребоваться конфигурация (HttpConfiguration
):
sut = new YourController()
{
Request = new HttpRequestMessage {
RequestUri = new Uri("http://www.unittests.com") },
Configuration = new HttpConfiguration()
};
Сообщите мне, если это работает.
Ответ 3
Кроме того, если ваш контроллер имеет инъекции, вы можете сделать:
var controller= new MyController(injectionA, injectionB, injectionC)
{
Request = new HttpRequestMessage(),
Configuration = new HttpConfiguration()
};
Я нахожу их всех в легком для понимания официальном документе сейчас.