如何为BadRequest编写单元测试用例
本文关键字:单元 测试用例 BadRequest | 更新日期: 2023-09-27 18:03:53
我想为以下代码编写单元测试用例
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
,则返回带有预定义错误消息的BadRequestErrorMessageResult
对象。2( 如果请求的MyID
属性为空GUID
,则返回带有另一个预定义错误消息的BadRequestErrorMessageResult
对象。
这意味着我们应该有两个单元测试:
[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);
}
您可以更进一步,将这些测试中的每一个拆分为两个,其中一个测试返回对象是否为预期类型,另一个测试验证返回对象状态是否为预期状态(例如Message
字符串是否为预期(。这样,每个测试就有一个断言。
旁注:
您用nunit
标记了这个问题,所以我提供了使用该框架的代码。不过,在您的示例中,您使用了来自Microsoft单元测试框架的[TestMethod]
属性。如果你想使用该框架,你必须进行一些更改,例如用Assert.IsInstanceOfType
替换Assert.IsInstanceOf
。
我假设GUID
是通过其构造函数传递给MyRequest
的,该构造函数将其分配给MyID
。
我不是来自网络世界,但我发现BadRequest
方法有一个重载,如果传递string
作为其参数,它将返回BadRequestErrorMessageResult
。