我可以使用“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,这是一个内部只写流,试图从中读取会抛出异常一个例外。