Web API で JSON オブジェクトを逆シリアル化するための単体テストを作成する正しい方法は何ですか?
私のアプリケーションでは、トレース情報を見て、Web API が JsonMeadiaTypeFormatter.ReadFromAsync を呼び出して、要求本文からのオブジェクト パラメーターを逆シリアル化しようとしていることに気付きました。問題を切り分けようとしているので、これらのテストを書きました。ReadTestItem は失敗します。他の例 ReadInt はパスするので、正しい方向に進んでいるように見えますが、これが Web API が実際に行っていることかどうかはわかりません。
編集: コードが修正され、FormatterConfig が追加されました
class TestClass
{
public string Type { get; set; }
public string Value { get; set; }
}
[TestClass]
public class FormatterTest
{
[TestMethod]
public void ReadTestItem()
{
MediaTypeFormatterCollection formatters = new MediaTypeFormatterCollection();
FormatterConfig.RegisterGlobalFormatters(formatters);
JsonMediaTypeFormatter formatter = formatters[0] as JsonMediaTypeFormatter;
Stream s = GenerateStreamFromString("{ type: \"Equal\", value: \"1\" }");
var content = new StreamContent(s);
var logger = new Mock<IFormatterLogger>().Object;
var task = formatter.ReadFromStreamAsync(typeof(TestClass), s, content, logger);
TestClass result = task.Result as TestClass;
Assert.AreEqual("Equal", result.Type);
Assert.AreEqual("1", result.Value);
}
[TestMethod]
public void TestReadInt()
{
MediaTypeFormatterCollection formatters = new MediaTypeFormatterCollection();
FormatterConfig.RegisterGlobalFormatters(formatters);
JsonMediaTypeFormatter formatter = formatters[0] as JsonMediaTypeFormatter;
Stream s = GenerateStreamFromString("2");
var content = new StreamContent(s);
var logger = new Mock<IFormatterLogger>().Object;
var task = formatter.ReadFromStreamAsync(typeof(int), s, content, logger);
Assert.AreEqual(2, task.Result);
}
public Stream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}
フォーマッタの構成は次のとおりです。
public class FormatterConfig
{
public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters)
{
var jsonSerializerSettings = formatters.JsonFormatter.SerializerSettings;
jsonSerializerSettings.Converters.Add(new IsoDateTimeConverter());
// serialize every enum as a string
jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
// include null value fields
jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
// use camel case
jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// indented formatting
bool indent;
Boolean.TryParse(ConfigurationManager.AppSettings["dex.indentjson"], out indent);
formatters.JsonFormatter.Indent = indent;
formatters.Remove(formatters.XmlFormatter);
}
}