我可以使用“HttpResultsFilter”回调测试表单数据吗?
Can I test form data using `HttpResultsFilter` callback?
在 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);
如何访问验证请求中的表单数据?
从 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
,这是一个内部只写流,试图从中读取会抛出异常一个例外。
在 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);
如何访问验证请求中的表单数据?
从 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
,这是一个内部只写流,试图从中读取会抛出异常一个例外。