【问题标题】:NUnit async Setup not supported?不支持 NUnit 异步设置?
【发布时间】:2016-03-11 19:49:21
【问题描述】:

我需要对一个以异步方式加载数据的方法进行单元测试。 我可以通过

轻松运行异步测试方法
[Test]
public async Task My_test_async() {
 // ... await something
}

但我也希望 Setup 方法是异步的。因为它在 mocked Db 中准备了一些数据。这个模拟数据库当然也是异步的(它必须实现相同的接口)。

所以我的设置方法是这样的:

[Setup]
public async Task Setup() {
  var db = new InMemoryDbContext();
  // ... add sample data in db context
  // ... then save them
  await db.SaveChangesAsync();
}

但这会导致我的测试被 NUnit Runner 跳过

我正在使用 NUnit 3.0.1 版、NUnitTestAdapter.WithFramework 2.0.0 版和带有 Resharper 9.2 的 VisualStudio 2015

可能的解决方法

我可以解决这个问题,但是这两种解决方案都不是很好。

解决方法 #1

将 Setup() 方法重构为私有,从中删除 [Setup] 属性,并在每个测试方法中调用它。这样就可以等待它并执行测试。

解决方法 #2

或者我可以使设置同步,并将异步代码包装在Task.Run().Result 中,像这样

var r = Task.Run(() => db.SaveChangesAsync()).Result;

但是这两种解决方法都很丑。

有人知道更好的解决方案吗?

【问题讨论】:

  • 最好的办法是在 GitHub 上的 NUnit 问题跟踪器上打开一个问题。它应该可以工作,AFAIK
  • this GitHub问题。

标签: c# visual-studio unit-testing asynchronous nunit


【解决方案1】:

在 NUnit3 中

[OneTimeSetUp]
public async Task Setup()
{

【讨论】:

  • 为了完整起见,也可用于设置属性:[SetUp] public async Task Setup() { }
【解决方案2】:

解决 #2 :D

[SetUp]
public void Setup()
{
    SetupAsync().Wait();
}

public async Task SetupAsync()
{
    var db = new InMemoryDbContext();
    // ... add sample data in db context
    // ... then save them
    await db.SaveChangesAsync();
}

【讨论】:

  • 我同意 - 将 setup 方法(甚至测试)作为异步方法运行是没有意义的。使用 Wait/Result 没有坏处
  • 可能死锁-1
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多