ban*_*eas 6 unit-testing asp.net-web-api mediatypeformatter
我已经扩展了JsonMediaTypeFormatter
为了在JSON中为使用自定义属性修饰的类型生成"根"对象.
我如何对这个格式化程序进行单元测试?我对如何检查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());
Run Code Online (Sandbox Code Playgroud)
注意事项:
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 };
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
设置服务器和客户端:
[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"));
}
Run Code Online (Sandbox Code Playgroud)
现在,在您的测试中,调用客户端上的方法并对结果执行您想要的操作:
var response = _client.GetAsync("test/1").Result;
var result = response.Content.ReadAsAsync<Item>(new HashSet<MediaTypeFormatter> {new TestMediaTypeFormatter()}).Result;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1645 次 |
最近记录: |