单元测试 ASP.NET Web API 2 控制器 returns 自定义结果
Unit testing ASP.NET Web API 2 Controller which returns custom result
我有一个 Web API 2 控制器,它的操作方法如下:
public async Task<IHttpActionResult> Foo(int id)
{
var foo = await _repository.GetFooAsync(id);
return foo == null ? (IHttpActionResult)NotFound() : new CssResult(foo.Css);
}
其中 CssResult
定义为:
public class CssResult : IHttpActionResult
{
private readonly string _content;
public CssResult(string content)
{
content.ShouldNotBe(null);
_content = content;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(_content, Encoding.UTF8, "text/css")
};
return Task.FromResult(response);
}
}
如何为此编写单元测试?
我试过这个:
var response = await controller.Foo(id) as CssResult;
但我无权访问实际内容,例如我想验证响应的实际内容是否是我期望的CSS。
有什么帮助吗?
是简单地使_content
字段public的解决方案吗? (感觉很脏)
避免转换,尤其是在单元测试中。
这应该有效:
var response = await controller.Foo(id);
var message = await response.ExecuteAsync(CancellationToken.None);
var content = await message.Content.ReadAsStringAsync();
Assert.AreEqual("expected CSS", content);
我有一个 Web API 2 控制器,它的操作方法如下:
public async Task<IHttpActionResult> Foo(int id)
{
var foo = await _repository.GetFooAsync(id);
return foo == null ? (IHttpActionResult)NotFound() : new CssResult(foo.Css);
}
其中 CssResult
定义为:
public class CssResult : IHttpActionResult
{
private readonly string _content;
public CssResult(string content)
{
content.ShouldNotBe(null);
_content = content;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(_content, Encoding.UTF8, "text/css")
};
return Task.FromResult(response);
}
}
如何为此编写单元测试?
我试过这个:
var response = await controller.Foo(id) as CssResult;
但我无权访问实际内容,例如我想验证响应的实际内容是否是我期望的CSS。
有什么帮助吗?
是简单地使_content
字段public的解决方案吗? (感觉很脏)
避免转换,尤其是在单元测试中。 这应该有效:
var response = await controller.Foo(id);
var message = await response.ExecuteAsync(CancellationToken.None);
var content = await message.Content.ReadAsStringAsync();
Assert.AreEqual("expected CSS", content);