等待异步的 Specflow 步骤 API
Specflow steps with await for async API
我们正在尝试获取以下场景步骤来中断测试,以防在 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 步骤?
当前发布的版本(2.1)中不支持async和await,增加了支持(通过this merged PR) in v2.2 which is available from the CI server,但还没有正式发布。
[编辑]
2.2已经发布,测试中支持async await。
我们正在尝试获取以下场景步骤来中断测试,以防在 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 步骤?
当前发布的版本(2.1)中不支持async和await,增加了支持(通过this merged PR) in v2.2 which is available from the CI server,但还没有正式发布。
[编辑]
2.2已经发布,测试中支持async await。