Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试ASP.NET Web API_C#_Unit Testing_Asp.net Web Api_Moq - Fatal编程技术网

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();
相关: