单元测试 – 我应该如何在Dart测试未来? - 代码日志

单元测试 – 我应该如何在Dart测试未来?

在测试运行完成之前,如何测试返回Future的方法?在异步方法完成之前,我的单元测试运行器完成了一个问题。
另一种可能性是使用expectAsync1功能。
测试初始不正确变体的工作类似物将是:

void main() {
  test("testing a future", () {
    Compute compute = new Compute();
    compute.sumIt([1, 2, 3]).then(expectAsync1((Map m) {
      Expect.equals(true, m.containsKey("value"));
      Expect.equals(6, m["value"]);
    }));
  });
}

使用expectAsync1进行异步测试的一个优点是其可组合性。有时测试自然需要几个连续的异步代码块。
来自mongo_db的示例测试:

testCursorGetMore(){
  var res;
  Db db = new Db('${DefaultUri}mongo_dart-test');
  DbCollection collection;
  int count = 0;
  Cursor cursor;
  db.open().chain(expectAsync1((c){
    collection = db.collection('new_big_collection2');
    collection.remove();
    return db.getLastError();
  })).chain(expectAsync1((_){
    cursor = new Cursor(db,collection,where.limit(10));
    return cursor.each((v){
     count++;
    });
  })).chain(expectAsync1((dummy){
    expect(count,0);
    List toInsert = new List();
    for (int n=0;n < 1000; n++){
      toInsert.add({"a":n});
    }
    collection.insertAll(toInsert);
    return db.getLastError();
  })).chain(expectAsync1((_){
    cursor = new Cursor(db,collection,where.limit(10));
    return cursor.each((v)=>count++);
  })).then(expectAsync1((v){
    expect(count,1000);
    expect(cursor.cursorId,0);
    expect(cursor.state,Cursor.CLOSED);
    collection.remove();
    db.close();
  }));
}

更新:

未来和单元测试API都被改变,因为问题最初被问到。
现在可以从test函数返回Future,并且unittest使用所有异步保护功能正确执行。
结合事实,链和然后的Future的方法现在合并,为几个连续的代码块提供了很好的语法测试。在当前版本的mongo_dart中,同样的测试看起来像:

Future testCursorGetMore(){
  var res;
  Db db = new Db('${DefaultUri}mongo_dart-test');
  DbCollection collection;
  int count = 0;
  Cursor cursor;
  return db.open().then((c){
    collection = db.collection('new_big_collection2');
    collection.remove();
    return db.getLastError();
  }).then((_){
    cursor = new Cursor(db,collection,where.limit(10));
    return cursor.forEach((v){
     count++;
    });
  }).then((dummy){
    expect(count,0);
    List toInsert = new List();
    for (int n=0;n < 1000; n++){
      toInsert.add({"a":n});
    }
    collection.insertAll(toInsert);
    return db.getLastError();
  }).then((_){
    cursor = new Cursor(db,collection,null);
    return cursor.forEach((v)=>count++);
  }).then((v){
    expect(count,1000);
    expect(cursor.cursorId,0);
    expect(cursor.state,State.CLOSED);
    collection.remove();
    return db.close();
  });
}
http://stackoverflow.com/questions/13678993/how-should-i-test-a-future-in-dart

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:单元测试 – 我应该如何在Dart测试未来?