Значение не может быть нулевым. Имя параметра: запрос

Я создаю 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()
};

Я нахожу их всех в легком для понимания официальном документе сейчас.