在ServiceStack项目中,我尝试测试以下应用程序代码:
var formData = "client_id={0}".Fmt(ClientId);
var contents = AccessTokenUrl.PostToUrl(formData);
ServiceStack提供HttpResultFilter
来模拟PostToUrl
效用函数。
我的测试使用如下:
using (new HttpResultsFilter
{
StringResultFn = (HttpWebRequest tokenRequest) =>
{
tokenRequest.RequestUri.ToString().Should().Be(
"https://example.com/auth/token");
tokenRequest.Method.Should().Be("POST");
tokenRequest.ContentType.Should().Be("application/x-www-form-urlencoded");
// TODO: Test form data
//formData["client_id"].Should().Be(Subject.ClientId);
如何在验证请求中访问表单数据?
答案 0 :(得分:3)
从 v4.0.50 来提高模拟HTTP请求的实用性,请求体现在在结果过滤器中传递,以便可以检查请求主体,例如:
using (new HttpResultsFilter
{
StringResultFn = (webReq, reqBody) =>
{
if (reqBody != null && reqBody.Contains("{\"a\":1}"))
return "mocked-by-body";
return webReq.RequestUri.ToString().Contains("google")
? "mocked-google"
: "mocked-yahoo";
}
})
{
"http://yahoo.com".PostJsonToUrl(json: "{\"a\":1}") //= mocked-by-body
"http://google.com".GetJsonFromUrl() //= mocked-google
"http://yahoo.com".GetJsonFromUrl() //= mocked-yahoo
}
在v4.0.50之前,这是不可能的,因为POST的数据被写入HttpWebRequest ConnectStream
,这是一个内部只写的流,试图从中读取将引发异常