Dart异步测试的奇怪行为

时间:2013-03-27 11:03:00

标签: testing asynchronous dart

为什么这不起作用?

var validUri = 'postgresql://user:pwd@localhost:5432/testdb';

test('Query on closed connection.', () {
  connect(validUri).then((conn) {
    conn.close();
    conn.query("select 'blah'").toList()
      .then((_) => throw new Exception('Should not be reached.'))
      .catchError(expectAsync1((err) {}));
  });
});

test('Execute on closed connection.', () {
  connect(validUri).then((conn) {
    conn.close();
    conn.execute("select 'blah'")
      .then((_) => throw new Exception('Should not be reached.'))
      .catchError(expectAsync1((err) {});
  });
});

但是,如果更改了最后一个 catchError 的回调分配:

(...)

test('Execute on closed connection.', () {
  var cb = expectAsync1((e) {});
  connect(validUri).then((conn) {
    conn.close();
    conn.execute("select 'blah'")
      .then((_) => throw new Exception('Should not be reached.'))
      .catchError(cb);
  });
});

有效!

我很想读一个很好的解释,也许在Dart异步测试中有一两课: - )

编辑: 问题是第一个例子确实有效 - 它报告了传递!它应该没有。我假设在以后的测试中必须回调expectAsyncX()。

这是测试框架的问题吗?不应忽视这类问题。

1 个答案:

答案 0 :(得分:4)

任何异步调用都应该包含expectAsyncX(),告诉测试等待其调用。 在第一种情况下,您的第一个异步调用未被包装,因此它不会“等待”足以在catchError中执行expectAsync1。