如何提供作为字符串的ObjectContent

时间:2014-07-15 09:12:15

标签: unit-testing asp.net-web-api

我正在编写一个单元测试,用于测试在请求中发送正文的场景,这是一个普通字符串,即不能解析为JSON。

在此测试中,我设置了HttpRequestMessage这样的内容:

var ojectContent = new ObjectContent(typeof(string)
                        , "aaaaa"
                        , new JsonMediaTypeFormatter());
httpRequestMessage.Content = objectContent;

问题是,当我调试代码时,请求体已设置为"aaaaa"(注意其他引号),这足以使反序列化代码以不同方式处理请求体,这意味着我可以&# 39; t测试我的意思来测试。我需要请求正文为aaaaa

有人可以建议我如何设置测试,以便请求正文不包含这些引号吗?

编辑:我也尝试了new ObjectContent(typeof(object)...,它也给出了相同的结果。

2 个答案:

答案 0 :(得分:1)

另一种方法是使用MediaTypeFormatter代替StringContent绕过ObjectContent

 var content = new StringContent("aaaaa");
 httpRequestMessage.Content = content;

答案 1 :(得分:-1)

好的,所以我需要创建一个不会以任何方式干扰输入的媒体类型格式化程序。我用过这个:

private class DoNothingTypeFormatter : MediaTypeFormatter
        {
            public override bool CanReadType(Type type)
            {
                return false;
            }

            public override bool CanWriteType(Type type)
            {
                if (type == typeof(string))
                {
                    return true;
                }

                return false;
            }

            public override Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
            {
                var myString = value as string;
                if (myString == null)
                {
                    throw new Exception("Everything is supposed to be a string here.");
                }

                var length = myString.Length;
                var bytes = System.Text.Encoding.UTF8.GetBytes(myString);

                return Task.Factory.StartNew(() => writeStream.Write(bytes, 0, length));
            }
        }

然后,当我想生成`HttpRequestMessage'的主体时,我这样做:

objectContent = new ObjectContent(typeof(string)
                        , "not json"
                        , new DoNothingTypeFormatter());