C# 单元测试ASP.NET Web API
我正在单元测试一篇简单的帖子:C# 单元测试ASP.NET Web API,c#,unit-testing,asp.net-web-api,moq,C#,Unit Testing,Asp.net Web Api,Moq,我正在单元测试一篇简单的帖子: public HttpResponseMessage<Document> PostDocument(Document document) { document = repository.Add(document); var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created); var uri = Url
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;
}
公共HttpResponseMessage PostDocument(文档)
{
document=repository.Add(文档);
var响应=新的HttpResponseMessage(文档,HttpStatusCode.Created);
var uri=Url.Route(null,新的{id=document.id});
response.Headers.Location=新Uri(Request.RequestUri,Uri);
返回响应;
}
然而,“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;
}
公共HttpResponseMessage PostDocument(文档文档,Uri位置=null)
{
document=repository.Add(文档);
var响应=新的HttpResponseMessage(文档,HttpStatusCode.Created);
if(位置==null)
{
var uri=Url.Route(null,新的{id=document.id});
位置=新Uri(Request.RequestUri,Uri);
}
response.Headers.Location=位置;
返回响应;
}
更新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;
}
公共HttpResponseMessage PostDocument(文档)
{
var uri=Url.Route(null,新的{id=document.id});
var location=新Uri(Request.RequestUri,Uri);
返回PostDocument(文档、位置);
}
[不行动]
公共HttpResponseMessagePostDocument(文档文档,Uri位置)
{
document=repository.Add(文档);
var响应=新的HttpResponseMessage(文档,HttpStatusCode.Created);
response.Headers.Location=位置;
返回响应;
}
请求属性应该是可设置的,因此您只需设置ControllerContext
(它应该有一个无参数构造函数,所以您甚至不需要模拟)。您的方法可能会接收HttpRequestMessage作为参数
public HttpResponseMessage<Document> PostDocument(Document document, HttpRequestMessage message)
{
}
公共HttpResponseMessage PostDocument(文档文档,HttpRequestMessage消息)
{
}
您可以从中获取RequestUri。在单元测试中,您可以放置HttpRequestMessage对象的test-double。使用FakeiTasy,我在TestInitialize中实现了这一点
this.Controller.ControllerContext = new System.Web.Http.Controllers.HttpControllerContext();
this.Controller.Request = A.Fake<HttpRequestMessage>();
this.Controller.ControllerContext=new System.Web.Http.Controllers.HttpControllerContext();
this.Controller.Request=A.false();
相关: