在C#中,在这种情况下,如何获得HTTP状态编号(200)并返回文本(“确定”)以进行API控制器的单元测试?我想我已经尝试了一切。当然,这是普遍需要。谢谢。
public IHttpActionResult Get(string appServer, string action)
{
return Ok("ok");
}
[TestMethod]
public void AppPoolTestStart()
{
AppPoolController controller = new AppPoolController();
IHttpActionResult result = controller.Get("MyServer", "start");
Assert.??? ; // check for 200 or "ok"
}
答案 0 :(得分:0)
Web API控制器操作可以返回以下任意值:
- void
- HttpResponseMessage
- IHttpActionResult
- 其他类型
根据返回的返回值,Web API使用不同的 HTTP响应的机制。
void
返回空204(无内容)HttpResponseMessage
直接转换为HTTP响应消息。IHttpActionResult
调用ExecuteAsync创建HttpResponseMessage,然后转换为HTTP响应消息。其他类型将序列化的返回值写入响应主体; 返回200(确定)。
...
IHttpActionResult
Web API 2中引入了IHttpActionResult接口。从本质上讲,它定义了HttpResponseMessage工厂。这里是使用IHttpActionResult接口的一些优点:
- 简化了控制器的单元测试。
- 将用于创建HTTP响应的通用逻辑转移到单独的类中。
- 通过隐藏构造响应的底层细节,使控制器动作的意图更清晰。
IHttpActionResult包含一个方法ExecuteAsync,该方法异步创建HttpResponseMessage实例。
public interface IHttpActionResult { Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); }
如果控制器操作返回IHttpActionResult,则Web API会调用ExecuteAsync方法来创建HttpResponseMessage。然后,它将HttpResponseMessage转换为HTTP响应消息。
因此,在您的情况下,您可以调用result.ExecuteAsync()
并等待生成的Task
完成,然后获取其HttpResponseMessage
对象。
但是,有一种不同的处理方法,下面的文档中对此进行了更详细的介绍:
Unit Testing Controllers in ASP.NET Web API 2
尤其是,请参见"Testing Actions that Return IHttpActionResult"上的部分:
在Web API 2中,控制器动作可以返回IHttpActionResult,这类似于ASP.NET MVC中的ActionResult。 IHttpActionResult接口定义用于创建HTTP响应的命令模式。控制器不直接创建响应,而是返回IHttpActionResult。稍后,管道调用IHttpActionResult来创建响应。这种方法使编写单元测试变得更加容易,因为您可以跳过HttpResponseMessage所需的许多设置。
在给出的示例中,他们只是将IHttpActionResult
类型转换为要测试的所需响应类型。例如:
// Act
IHttpActionResult actionResult = controller.Get(42);
var contentResult = actionResult as OkNegotiatedContentResult<Product>;
// Assert
Assert.IsNotNull(contentResult);
Assert.IsNotNull(contentResult.Content);
Assert.AreEqual(42, contentResult.Content.Id);
// Act
IHttpActionResult actionResult = controller.Get(10);
// Assert
Assert.IsInstanceOfType(actionResult, typeof(NotFoundResult));
// Act
IHttpActionResult actionResult = controller.Delete(10);
// Assert
Assert.IsInstanceOfType(actionResult, typeof(OkResult));
以此类推。