我可以使用`HttpResultsFilter`回调来测试表单数据吗?

时间:2015-07-25 19:53:20

标签: httpwebrequest servicestack httprequest

在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);

如何在验证请求中访问表单数据?

1 个答案:

答案 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,这是一个内部只写的流,试图从中读取将引发异常