【问题标题】:Specflow steps with await for async API带有等待异步 API 的 Specflow 步骤
【发布时间】:2017-02-23 06:51:27
【问题描述】:

我们正在尝试获取以下场景步骤来中断测试,以防DoAyncStuff() 方法内发生故障:

[Given(@"There is something")]
public async Task GivenSomething()
{
    await DoStuff();
}

private async Task DoStuff()
{
    await Task.Run(() => Thread.Sleep(1000));
    throw new ApplicationException("Boom");
}

但在您使用.Wait() 或.Result 之前,它实际上是一个愉快的绿色运行:

[Given(@"There is something")]
public void GivenSomething()
{
    DoStuff().Wait();
}

问题似乎出在 NUnit 生成规范中,如下所示:

public virtual void SomethingAsync()
{
    ...
    testRunner.Given("There is something", ...);
    ...
}

这似乎适用于以下代码:

public virtual async Task SomethingAsync()
{
    ...
    await this.ScenarioSetup(scenarioInfo);
    ...
}

上面的代码是手动编辑自动生成的文件,所以我其实是在寻找一种自动生成以下代码的方法。

The documentation 似乎是可用于异步 API 的唯一选项,但它实际上是用于 Silverlight 的,据我所知使用某种 API,而我们更喜欢使用原生 C# await 关键字。

有没有办法原生处理async/await是SpecFlow的步骤?

【问题讨论】:

标签: c# async-await nunit bdd specflow


【解决方案1】:

在当前发布的版本 (2.1) 中不支持 async 和 await,在 v2.2 中添加了支持(通过this merged PR),可从CI server 获得,但没有正式发布还没有。

[编辑]

2.2 已发布并支持测试中的异步等待。

【讨论】:

  • 这有什么更新吗?,我安装了2017版的specflow,它似乎没有生成异步测试,但是specflow nuget的版本是2.2。从生成的代码中,它说生成器是 2.0
  • 在 VS2017 和 SpecFlow 2.2.0 与 xUnit 2.2.0 中存在相同的问题。不等待异步测试(我编写的部分,而不是自动生成的代码),流程立即进入下一步。
  • 我在 VS 2017 中运行 SpecFlow 2.2.0 和 SpecFlow.xUnit 2.2.0,它按预期工作。也许作为问题发布@SkorunkaFrantišek :-)
  • 我正在使用带有 SpecFlow 2.2.1 的 VS 2015,当我用 async 装饰一个步骤并在里面使用 await 时,它会进入下一步。所以现在我在异步调用中使用 .Result。
  • @VargaTamas 你确保你的步骤使用async Task 签名吗?我很确定它有效。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2017-10-18
  • 2017-05-19
  • 2017-10-29
  • 1970-01-01
相关资源
最近更新 更多