如何为 BadRequest 编写单元测试用例?

How to write unit test case for BadRequest?

我想为以下代码编写单元测试用例

HomeController.cs

[HttpPost]
        [ActionName("CreateDemo")]
        public async Task<IHttpActionResult> CreateDemo([FromBody] MyRequest request)
        {
            if (request == null)
            {                    
                return BadRequest("request can not be null");
            }
            if (request.MyID == Guid.Empty)
            {
                return BadRequest("MyID must be provided");
            }
        }

我试过如下,但我猜这是不正确的方法

 [TestMethod]
        public async Task NullCheck()
        {
            try
            {
                var controller = new HomeController();
                var resposne = await controller.CreateDemo(null);
                Assert.AreEqual(); // not sure what to put here
            }
            catch (HttpResponseException ex) //catch is not hit
            {
                Assert.IsTrue(
                     ex.Message.Contains("request can not be null"));
            }

        }

每个单元测试应测试一个需求或关注点。您的方法实现了两个要求:

1) 如果请求是 null、return BadRequestErrorMessageResult 带有预定义错误消息的对象。 2) 如果请求的 MyID 属性 是空的 GUID, return BadRequestErrorMessageResult object with another predefined error message.

这意味着我们应该进行两个单元测试:

[Test]
public async Task CreateDemo_returns_BadRequestErrorMessageResult_when_request_is_null()
{
   // Arrange
   var controller = new HomeController();

   // Act
   var response = await controller.CreateDemo(null);

   // Assert
   Assert.IsInstanceOf<BadRequestErrorMessageResult>(response);
   Assert.AreEqual("request can not be null", response.Message);
}

[Test]
public async Task CreateDemo_returns_BadRequestErrorMessageResult_when_request_ID_is_empty_GUID()
{
   // Arrange
   var controller = new HomeController();
   var request = new MyRequest(Guid.Empty);

   // Act
   var response = await controller.CreateDemo(request);

   // Assert
   Assert.IsInstanceOf<BadRequestErrorMessageResult>(response);
   Assert.AreEqual("MyID must be provided", response.Message);
}

您可以更进一步,将这些测试中的每一个分成两个,其中一个测试 return 对象是否属于预期类型,另一个验证 returned 对象状态是否符合预期(例如 Message 字符串符合预期)。这样你每次测试都会有一个断言。

旁注:

你用 nunit 标签标记了这个问题,所以我提供了使用该框架的代码。不过在您的示例中,您使用了来自 Microsoft 单元测试框架的 [TestMethod] 属性。如果您想使用该框架,则必须进行一些更改,例如将 Assert.IsInstanceOf 替换为 Assert.IsInstanceOfType.

我假设 GUID 通过其构造函数传递给 MyRequest,该构造函数将其分配给 MyID

我不是来自网络世界,但我发现 BadRequest 方法有一个重载,如果 string 作为参数传递,returns BadRequestErrorMessageResult