2016-08-12 2 views
6

Я создаю единичный тест с помощью nunit, и весь этот код отлично работает во время выполнения.Значение не может быть нулевым. Имя параметра: request

У меня есть этот защищенный код HttpResponseMessage, который вызывается моим контроллером, когда он возвращается.

Однако ошибка:

"Value cannot be null. Parameter name: request" is displaying.

И когда я проверяю запрос, он на самом деле null.

Вопрос: Как я могу запрограммировать мой модульный тест, чтобы вернуть 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

Я думаю, что происходит, что вы не инстанцировании или присвоения вашей собственности Request (HttpRequestMessage), когда вам новый контроллер. Я считаю, что обязательно указывать запрос до вызова метода Api через ваш модульный тест.

Вы также можете потребовать конфигурации (HttpConfiguration):

sut = new YourController() 
    { 
     Request = new HttpRequestMessage { 
      RequestUri = new Uri("http://www.unittests.com") }, 

     Configuration = new HttpConfiguration() 
    }; 

Позвольте мне знать, если это работает.

+0

Это работает для меня: MyController контроллер = новый MyController() {Запрос = новый System.Net.Http.HttpRequestMessage() }; –

7

Причина, почему вы получаете:

An exception of type 'System.ArgumentNullException' occurred in System.Web.Http.dll but was not handled in user code Additional information: Value cannot be null.

потому, что Request объект null.

enter image description here

Раствор для того, чтобы создать экземпляр контроллера в тестах, таких как:

var myApiController = new MyApiController 
    { 
     Request = new System.Net.Http.HttpRequestMessage(), 
     Configuration = new HttpConfiguration() 
    }; 

Таким образом, при создании нового экземпляра MyApiController класса мы инициализируем объект Request. Кроме того, также необходимо предоставить связанный объект конфигурации.

Наконец, пример модульного теста для Api контроллера может быть:

[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); 
    } 
}