从IHttpActionResult返回值获取HTTP状态

时间:2019-01-22 21:35:54

标签: http get status

在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" 
}

1 个答案:

答案 0 :(得分:0)

Action Results in Web API 2

  

Web API控制器操作可以返回以下任意值:

     
      
  1. void
  2.   
  3. HttpResponseMessage
  4.   
  5. IHttpActionResult
  6.   
  7. 其他类型
  8.   
     

根据返回的返回值,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));

以此类推。