我需要对以异步方式加载数据的方法进行单元测试.我可以轻松地运行异步测试方法
[Test] public async Task My_test_async() { // ... await something }
但我也希望该Setup
方法是异步的.因为它在模拟的Db中准备了一些数据.这个模拟的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和VisualStudio 2015与Resharper 9.2
可能的解决方法
我可以解决这个问题,但两种解决方案都不是很好.
解决方法#1
重构Setup()方法是私有的,从中删除[Setup]属性,并在每个测试方法中调用它.这样就可以等待,测试就会执行.
解决方法#2
或者我可以使安装程序同步,并将异步代码包装在内Task.Run().Result
,就像这样
var r = Task.Run(() => db.SaveChangesAsync()).Result;
但这两种解决方法都很难看.
有谁知道更好的解决方案?
解决#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(); }
在NUnit3中
[OneTimeSetUp] public async Task Setup() {