我需要对以异步方式加载数据的方法进行单元测试。 我可以通过
轻松运行异步测试方法[Test]
public async Task My_test_async() {
// ... await something
}
但我也希望Setup
方法是异步的。因为它在模拟的Db中准备了一些数据。这个模拟的数据库当然也是异步的(它必须实现相同的接口)。
所以我的设置方法如下所示:
[Setup]
public async Task Setup() {
var db = new InMemoryDbContext();
// ... add sample data in db context
// ... then save them
await db.SaveChangesAsync();
}
我正在使用NUnit版本3.0.1,NUnitTestAdapter.WithFramework版本2.0.0和VisualStudio 2015与Resharper 9.2
可能的解决方法
我可以解决这个问题,但两种解决方案都不是很好。
解决方法#1
将Refactor Setup()方法设为私有,从中删除[Setup]属性,并在每个测试方法中调用它。这样就可以等待,测试就会执行。
解决方法#2
或者我可以使安装程序同步,并将异步代码包装在Task.Run().Result
中,就像这样
var r = Task.Run(() => db.SaveChangesAsync()).Result;
但两种解决方法都很难看。
有谁知道更好的解决方案?
答案 0 :(得分:8)
解决#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();
}
答案 1 :(得分:8)
在NUnit3中
[OneTimeSetUp]
public async Task Setup()
{