【问题标题】:How to Test controller method which returns Task<IHttpActionResult> with anonymous type如何测试返回具有匿名类型的 Task<IHttpActionResult> 的控制器方法
【发布时间】:2017-03-10 11:27:06
【问题描述】:

我有一个 Web API 控制器方法,如下所示 SessionId 是“字符串”类型

[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。虽然在调试时我可以看到status.Content 内部有SessionId 属性,但由于这是匿名类型,我无法读取该值。

我也试过

var status = result as OkNegotiatedContentResult<object>;

还是不行

【问题讨论】:

    标签: c# testing asp.net-web-api xunit


    【解决方案1】:

    下面是一个最小的完整示例,说明如何绕过测试操作。然而,这更像是一个集成测试,因为它通过框架功能来访问结果的内容。

    [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,以便访问成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 2015-11-27
      • 1970-01-01
      • 2021-11-20
      • 2010-09-08
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多