异步代码的UnitTest示例

时间:2013-04-10 12:10:03

标签: dart dart-async dart-unittest

以某种方式阅读Unit Testing with Dart之后,我仍然无法理解如何将其与Future一起使用。

例如:

void main()
{
    group('database group',(){
    setUp( () {
                // Setup
           });

    tearDown((){
                // TearDown
           });

    test('open connection to local database', (){
        DatabaseBase database = null;

        expect(database = new MongoDatabase("127.0.0.8", "simplechat-db"), isNotNull);

        database.AddMessage(null).then(
            (e) {
                  expectAsync1(e) 
                  {
                     // All ok
                  }
                },
            onError: (err)
                     {
                        expectAsync1(bb)
                        {
                          fail('error !');
                        }
                     }
         );

});

// Add more tests here

}); }

因此,在测试中,我创建了一个基本抽象类DatabaseBase的实例,其中包含一些实际MongoDb类的参数,并立即检查它是否已创建。然后我只运行一些非常简单的函数:AddMessage。该函数定义为:

Future AddMessage(String message);

并返回completer.future

如果传递message为null,则函数将使完成失败为:.completeError('Message can not be null');

在实际测试中,我想测试Future是否成功完成或出错。所以上面是我尝试了解如何测试Future返回 - 问题是这个测试没有失败 :(

您能否回答一些代码示例,如何测试返回Future的函数?在测试中我的意思是 - 有时我想测试返回(成功)值并且如果成功值不正确而失败测试并且另一个测试失败则函数将失败Future并进入onError:块。 / p>

2 个答案:

答案 0 :(得分:3)

我刚刚重新阅读了你的问题,我意识到我正在回答一些错误的问题......

我相信您错误地使用了expectAsyncexpectAsync用于包含带有N个参数的回调,并确保它运行count次(默认值为1)。

expectAsync将确保测试本身捕获任何异常并返回。它实际上并没有任何期望(错误的命名法。)

你想要的只是:

database.AddMessage(null).then(
  (value) { /* Don't do anything! No expectations = success! */ },
  onError: (err) { 
    // It's enough to just fail!
    fail('error !');
  }
);

或者如果您需要确保测试完成某个特定值:

database.AddMessage(null).then(
  expectAsync1((value) { /* Check the value in here if you want. */ }),
  onError: (err) { 
    // It's enough to just fail!
    fail('error !');
  }
);

另一种方法是使用completes匹配器。

// This will register an asynchronous expectation that will pass if the
// Future completes to a value.
expect(database.AddMessage(null), completes);

或测试例外:

// Likewise, but this will only pass if the Future completes to an exception.
expect(database.AddMessage(null), throws);

如果要检查已完成的值,可以执行以下操作:

expect(database.AddMessage(null).then((value) {
  expect(value, isNotNull);
}), completes);

请参阅:

答案 1 :(得分:1)

可以从Future方法返回test() - 这会导致单元测试等待Future完成。

我通常会将expect()来电置于then()回调中。例如:

test('foo', () {
  return asyncBar().then(() => expect(value, isTrue));
});