151

我正在尝试为我的 ApiController 编写一些单元测试并遇到了一些问题。有一个很好的扩展方法,叫做 Request.CreateResponse,它对生成响应有很大帮助。

public HttpResponseMessage Post(Product product)
{
  var createdProduct = repo.Add(product);
  return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}

有没有办法在不使用部分模拟或直接使用“new HttpResponseMessage(...)”的情况下模拟 CreateResponse?

4

5 回答 5

246

解决此问题的另一种方法是执行以下操作:

controller.Request = new HttpRequestMessage();
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, 
                                  new HttpConfiguration());

如果要升级到 webapi 5.0,则需要将其更改为:

controller.Request = new HttpRequestMessage();
controller.Request.SetConfiguration(new HttpConfiguration());

您需要这样做的原因是您必须Request在控制器上进行填充,否则扩展方法Request将不起作用。您还必须对HttpConfiguration请求进行设置,否则路由和管道的其他部分将无法正常运行。

于 2012-06-08T21:00:55.927 回答
24

您可以像这样设置控制器对象以实现可测试性:

var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } });

controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

复制自 Peter Provost 关于单元测试 ASP.NET Web API的综合博文。

于 2013-02-20T08:58:21.583 回答
6

对于 Web API 2,您可以简单地添加

controller.Request = new HttpRequestMessage();
controller.Configuration = new HttpConfiguration();

像这样

[TestMethod]
public void GetReturnsProduct()
{
    // Arrange
    var controller = new ProductsController(repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.Get(10);

    // Assert
    Product product;
    Assert.IsTrue(response.TryGetContentValue<Product>(out product));
    Assert.AreEqual(10, product.Id);
}

在控制器上设置请求和配置很重要。否则,测试将失败并出现 ArgumentNullException 或 InvalidOperationException。

请参阅此处了解更多信息。

于 2018-10-30T15:32:34.223 回答
1

WebAPI 1 here 与使用 VB 的类似问题。

我设法在这里混合响应以使其像这样简单地工作:

Dim request As HttpRequestMessage = New HttpRequestMessage()
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration)

只是张贴以防万一它对任何人有帮助。

于 2017-03-15T15:34:19.150 回答
1

在您的测试类中,创建控制器类的实例。例如var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage();
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
于 2018-02-12T16:24:38.373 回答