カスタム属性で装飾されたタイプの JSON で「ルート」オブジェクトを生成するために、を拡張しJsonMediaTypeFormatter
ました。
このフォーマッタを単体テストするにはどうすればよいですか? メソッドのチェック方法に特に興味がありますWriteToStreamAsync(..)
。
カスタム属性で装飾されたタイプの JSON で「ルート」オブジェクトを生成するために、を拡張しJsonMediaTypeFormatter
ました。
このフォーマッタを単体テストするにはどうすればよいですか? メソッドのチェック方法に特に興味がありますWriteToStreamAsync(..)
。
無料の O'Reilly 電子ブックDesigning Evolvable Web APIs with ASP.NETには、MediaTypeFormatter
.
のテスト方法は次のとおりですWriteToStreamAsync
。(これは私がWebApiContrib.Formatters.Xlsx をテストするために採用したアプローチであり、うまく機能します。)
var ms = new MemoryStream();
var content = new FakeContent();
content.Headers.ContentType = new MediaTypeHeaderValue("application/atom+xml");
var formatter = new SyndicationMediaTypeFormatter();
var task = formatter.WriteToStreamAsync(typeof(List<ItemToSerialize>),
new List<ItemToSerialize> { new ItemToSerialize { ItemName = "Test" }},
ms,
content,
new FakeTransport()
);
task.Wait();
ms.Seek(0, SeekOrigin.Begin);
var atomFormatter = new Atom10FeedFormatter();
atomFormatter.ReadFrom(XmlReader.Create(ms));
Assert.Equal(1, atomFormatter.Feed.Items.Count());
注意事項:
FakeContent
とはそれぞれとクラスFakeTransport
の偽物であり、記事で見つけることができるコードです。HttpContent
TransportContext
Task.Wait
によって返されたタスクがWriteToStreamAsync
終了するまで実行をブロックするために使用されます。MemoryStream
、適切なフォーマッタ/デシリアライザによって読み取られて解析されるため、テスト アサーションを作成できます。または、サンプル コントローラーの実装を作成し、実行を開始して、クライアントを使用してテストし、コントローラー メソッドを呼び出すこともできます。これは Chris Missal がWebApiContrib.Formatting.Bsonで行うことです。
コントローラーは複雑である必要はありません。
public class TestController : ApiController
{
public Item Get(int id)
{
return new Item { ID = id };
}
// ...
}
サーバーとクライアントをセットアップします。
[TestFixtureSetUp]
public void fixture_init()
{
var config = new HttpConfiguration();
config.Formatters.Add(new TestMediaTypeFormatter());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);
var server = new HttpServer(config);
_client = new HttpClient(server);
_client.BaseAddress = new Uri("http://www.test.com/");
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson"));
}
ここで、テストでクライアントのメソッドを呼び出し、結果に対して必要なことを行います。
var response = _client.GetAsync("test/1").Result;
var result = response.Content.ReadAsAsync<Item>(new HashSet<MediaTypeFormatter> {new TestMediaTypeFormatter()}).Result;