我有一个控制器Action如下:
[HttpPost]
[EnableQuery]
[ODataRoute("PostData")]
public async Task<string> PostData(HttpRequestMessage message)
{
//Do operations
}
我需要为这个方法创建一个模拟对象,但我不知道如何传递参数“HttpRequestMessage”,因为如果要传递任何变量,那么它只是用类型进行初始化,比如字符串或整数。如何在模拟中处理此条件?
我有一个控制器Action如下:
[HttpPost]
[EnableQuery]
[ODataRoute("PostData")]
public async Task<string> PostData(HttpRequestMessage message)
{
//Do operations
}
HttpRequestMessage
非常可变:
public class HttpRequestMessage : IDisposable
{
[... ctors]
public Version Version { get; set; }
public HttpContent Content { get; set; }
public HttpMethod Method { get; set; }
public Uri RequestUri { get; set; }
public HttpRequestHeaders Headers { get; }
public IDictionary<string, object> Properties { get; }
[... Dispose, ToString]
}
如果你只需要设置RequestUri
,你可以这样做:
var requestMessage = new HttpRequestMessage() { RequestUri = new Uri("http://www.google.com") };
yourClassInstance.PostData(requestMessage);
即使您需要添加一些头文件或属性,使用 GetRequestContext
,可以创建HttpRequestContext
。
requestMessage.Headers.Add("h", "v");
requestMessage.Properties.Add("p", "v");
这个设计(HttpRequestMessage
)完全没有遵循函数式编程原则,但至少你可以轻松地进行测试。
HttpRequestMessage
的定义,并认为由于它是只读属性,因此Headers
无法进行模拟,但没有意识到您可以像那样使用Add()
添加标头。很高兴我找到了这个方法。 - Tony D