【问题标题】:Value cannot be null. Parameter name: request值不能为空。参数名称:请求
【发布时间】:2016-08-12 04:15:19
【问题描述】:

我正在使用 nunit 创建一个单元测试,并且所有这些代码在运行时都可以正常工作。

我在下面有这个受保护的HttpResponseMessage 代码,当它返回时由我的控制器调用。

但是,一个错误:

“值不能为空。参数名称:请求”正在显示。

当我检查请求时,它实际上是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)
        });
    }

【问题讨论】:

    标签: c# unit-testing nunit httprequest httpresponsemessage


    【解决方案1】:

    你得到的原因:

    System.Web.Http.dll 中出现“System.ArgumentNullException”类型的异常,但未在用户代码中处理 附加信息:值不能为空。

    是因为Request 对象是null

    解决方案是在测试中创建控制器实例,例如:

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

    【讨论】:

      【解决方案2】:

      我认为当您新建 Controller 时,您没有实例化或分配您的 Request 属性 (HttpRequestMessage)。我认为必须在通过单元测试调用 Api 方法之前指定请求。

      您可能还需要配置 (HttpConfiguration):

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

      让我知道这是否有效。

      【讨论】:

      • 这对我有用:MyController controller = new MyController() { Request = new System.Net.Http.HttpRequestMessage() };
      【解决方案3】:

      另外,如果你的控制器有注入,你可以这样做:

      var controller= new MyController(injectionA, injectionB, injectionC)
      {
          Request = new HttpRequestMessage(),
          Configuration = new HttpConfiguration()
      };
      

      我现在在易于理解的official doc 上找到它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 2014-05-17
        • 2016-05-14
        • 2015-11-05
        相关资源
        最近更新 更多