如何从任务<IActionResult>中获取通过用于单元测试的API返回的值??

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (799)

我已经使用ASP.NETMVC Corev2.1创建了一个API。我的一个HttpGet方法设置如下:

public async Task<IActionResult> GetConfiguration([FromRoute] int? id)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        ..... // Some code here

        return Ok(configuration);
    }
    catch (Exception ex)
    {
        ... // Some code here
    }
}

在单元测试时,我可以检查OK是响应,但我确实需要看到配置的值。我似乎无法让它与以下几点一起工作:

[TestMethod] 
public void ConfigurationSearchGetTest()
{
    var context = GetContextWithData();
    var controller = new ConfigurationSearchController(context);
    var items = context.Configurations.Count();
    var actionResult = controller.GetConfiguration(12);

    Assert.IsTrue(true);
    context.Dispose();
}

在运行时,我可以检查actionResult有某些我无法编码的值。我做错什么了吗?还是我只是想错了?我希望能够:

Assert.AreEqual(12, actionResult.Values.ConfigurationId);
提问于
用户回答回答于

你需要等待对GetConfiguration的调用,以获得IActionResult对象,如下所示:

var actionResult = await controller.GetConfiguration(12);

要做到这一点,你还需要将测试方法的签名更改为异步。因此,改变这个:

public void ConfigurationSearchGetTest()

对此:

public async Task ConfigurationSearchGetTest()
用户回答回答于

你将遇到的问题之一是你正在使用,IActionResult因为它允许你返回BadRequest(...)Ok(...)。但是,由于你正在使用ASP.NET MVC Core 2.1,因此你可能想要改为使用新ActionResult<T>类型。这应该有助于你的测试,因为你现在可以直接访问强类型返回值。例如:

//Assuming your return type is `Configuration`
public async Task<ActionResult<Configuration>> GetConfiguration([FromRoute] int? id)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        ..... // Some code here

        // Note we are now returning the object directly, there is an implicit conversion 
        // done for you
        return configuration;
    }
    catch (Exception ex)
    {
        ... // Some code here
    }
}

请注意,我们现在直接返回对象,因为存在来自to隐式转换FooActionResult<Foo>

现在你的测试可以看起来像这样:

[TestMethod] 
public async Task ConfigurationSearchGetTest()
{
    var context = GetContextWithData();
    var controller = new ConfigurationSearchController(context);
    var items = context.Configurations.Count();

    // We now await the call
    var actionResult = await controller.GetConfiguration(12);

    // And the value we want is now a property of the return
    var configuration = actionResult.Value;

    Assert.IsTrue(true);
    context.Dispose();
}

扫码关注云+社区

领取腾讯云代金券