20

我正在使用 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)
        });
    }
4

3 回答 3

23

你得到的原因:

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);
    }
}
于 2017-01-17T21:43:22.973 回答
4

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

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

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

        Configuration = new HttpConfiguration()
    };

让我知道这是否有效。

于 2016-08-14T15:54:25.413 回答
2

此外,如果您的控制器有注入,您可以执行以下操作:

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

我现在可以在易于理解的官方文档中找到它们。

于 2019-06-28T01:25:00.210 回答