[英]How do I unit test web api action method when it returns IHttpActionResult?
[英]How to Test controller method which returns Task<IHttpActionResult> with anonymous type
我有一个Web API控制器方法,如下所示, SessionId
类型为'string'
[HttpPost]
[Route("init")]
[ApiMeter("search_init")]
public async Task<IHttpActionResult> InitiateAsync(SearchInitRequest query,
CancellationToken cancellationToken)
{
Validations.EnsureValid(query, new SearchRequestValidator());
string sessionId = await Service.InitiateSearchAsync(query, cancellationToken);
return Ok(new { sessionId });
}
我有下面的测试用例
[Fact]
public void GetSearchInit_Success_Valid()
{
var mockCarService = new Mock<ICarService>();
using (new AmbientContextScope(GetCarCallContext()))
{
var request = Data.DataProvider.TestDataProvider.GetJsonResult<CarSearchInitRequest>(
SearchInitScenarioRequests.CarSearchInitSuccess);
var response = Data.DataProvider.TestDataProvider.GetResponse<CarSearchInitResponse>(
SearchInitScenarioResponse.CarSearchInitSuccess);
mockCarService.Setup(f => f.InitiateSearchAsync(request, CancellationToken.None))
.Returns(Task.FromResult(response.SessionId));
SearchController controller = new SearchController(mockCarService.Object);
var result = controller.InitiateAsync(request, CancellationToken.None).Result;
var status = result as OkNegotiatedContentResult<string>;
Assert.NotNull(status.Content);
}
}
在这个测试用例中,我的状态为null
。 虽然在调试时,我可以看到有SessionId
内部属性status.Content
但因为这是匿名类型的,我不能够读取该值。
我也尝试过
var status = result as OkNegotiatedContentResult<object>;
仍然没有运气
这是一个如何处理测试操作的最小完整示例。 然而,这更像是集成测试,因为它正在通过框架功能来访问结果的内容。
[TestClass]
public class UnitTest6 {
[TestMethod]
public async Task Action_Returns_AnonymousTypeResult() {
//Arrange
var controller = new SearchController() {
Configuration = new HttpConfiguration(),
Request = new HttpRequestMessage()
};
var expected = "hello world";
//Act
var result = await controller.InitiateAsync();
var response = await result.ExecuteAsync(CancellationToken.None);
var status = await response.Content.ReadAsAsync<dynamic>();
//Assert
Assert.IsNotNull(status.sessionId);
Assert.AreEqual(expected, status.sessionId);
}
[Authorize]
public class SearchController : ApiController {
[HttpPost]
public async Task<IHttpActionResult> InitiateAsync() {
string sessionId = await Task.FromResult("hello world");
return Ok(new { sessionId });
}
}
}
通过执行结果来获取响应消息,现在可以访问响应的内容。 允许将内容解析为dynamic
内容,以便可以访问成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.