单元测试 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 不会进入代码