如何测试以匿名类型返回任务<IHttpActionResult&>的控制器方法控制器、任务、类型、测试

2023-09-04 02:06:28 作者:混世小魔女

我有一个如下所示的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);

    }
}
本地测试php网站 四款最常用的php环境套件

在此测试用例中,我的状态为null。虽然在调试时我可以看到SessionId中有SessionId属性,但由于这是匿名类型,我无法读取该值。

我也尝试过

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