6

カスタム属性で装飾されたタイプの JSON で「ルート」オブジェクトを生成するために、を拡張しJsonMediaTypeFormatterました。

このフォーマッタを単体テストするにはどうすればよいですか? メソッドのチェック方法に特に興味がありますWriteToStreamAsync(..)

4

1 に答える 1

3

無料の 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の偽物であり、記事で見つけることができるコードです。HttpContentTransportContext
  • 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;
于 2014-01-04T18:59:34.413 に答える