单元测试 ASP.NET Web API

Posted

技术标签:

【中文标题】单元测试 ASP.NET Web API【英文标题】:Unit Testing 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; 

【问题讨论】:

相关:***.com/questions/10042290/… 【参考方案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 对象的测试替身。

【讨论】:

以上是关于单元测试 ASP.NET Web API的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码

ASP.NET 系列:单元测试

使用 ApplicationDbContext 进行单元测试帐户控制器

ASP.NET 系列:单元测试

ASP.NET 系列:单元测试之SmtpClient

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试