【问题标题】:Unit Testing ASP.NET Web API单元测试 ASP.NET Web API
【发布时间】:2012-03-18 00:38:09
【问题描述】:

我正在对一个简单的帖子进行单元测试:

public HttpResponseMessage<Document> PostDocument(Document document) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created); 

    var uri = Url.Route(null, new { id = document.Id }); 

    response.Headers.Location = new Uri(Request.RequestUri, uri); 

    return response; 
}

但是,'URL' 和 'Request' 显然会为空。

除了模拟 ControllerContext 和 HttpContext 之外,还有其他方法吗?

更新:

改成:

 public HttpResponseMessage<Document> PostDocument(Document document,Uri location = null) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);

    if (location == null)
    {
        var uri = Url.Route(null, new { id = document.Id });
        location = new Uri(Request.RequestUri, uri);
    }

    response.Headers.Location = location;

    return response; 
}

更新 2:

这样更好:

public HttpResponseMessage<Document> PostDocument(Document document)
{
    var uri = Url.Route(null, new { id = document.Id });
    var location = new Uri(Request.RequestUri, uri);

    return PostDocument(document, location);
}

[NonAction]
public HttpResponseMessage<Document> PostDocument(Document document, Uri location) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);
    response.Headers.Location = location;
    return response; 
}

【问题讨论】:

标签: c# unit-testing asp.net-web-api moq


【解决方案1】:

Request 属性应该是可设置的,因此您只需设置 ControllerContext(它应该有一个无参数的构造函数,因此您甚至不必模拟)。

【讨论】:

    【解决方案2】:

    使用 FakeItEasy 我让它在 TestInitialize 中执行此操作。

    this.Controller.ControllerContext = new System.Web.Http.Controllers.HttpControllerContext();
    this.Controller.Request = A.Fake<HttpRequestMessage>();
    

    【讨论】:

      【解决方案3】:

      您的方法可能会收到 HttpRequestMessage 作为参数。

       public HttpResponseMessage<Document> PostDocument(Document document, HttpRequestMessage message)
      {
      
      } 
      

      您可以从中获取 RequestUri。在您的单元测试中,您可以放置​​ HttpRequestMessage 对象的测试替身。

      【讨论】:

        猜你喜欢
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 2013-10-10
        相关资源
        最近更新 更多