模拟 HttpRequestMessage

4

我有一个控制器Action如下:

[HttpPost]
[EnableQuery]
[ODataRoute("PostData")]
public async Task<string> PostData(HttpRequestMessage message)
{

//Do operations
}

我需要为这个方法创建一个模拟对象,但我不知道如何传递参数“HttpRequestMessage”,因为如果要传递任何变量,那么它只是用类型进行初始化,比如字符串或整数。如何在模拟中处理此条件?

创建一个请求实例,填充与测试相关的内容,并将其传递给被测试的方法。 - Nkosi
1个回答

2

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)完全没有遵循函数式编程原则,但至少你可以轻松地进行测试。


1
我最初查看了HttpRequestMessage的定义,并认为由于它是只读属性,因此Headers无法进行模拟,但没有意识到您可以像那样使用Add()添加标头。很高兴我找到了这个方法。 - Tony D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接