5

どういうわけかDartで単体テストを読んだ後、sでそれを使用する方法をまだ理解できません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

}); }

したがって、テストでは、実際のMongoDbDatabaseBaseクラスへのいくつかのパラメーターを使用して基本抽象クラスのインスタンスを作成し、作成されたかどうかをすぐに確認します。次に、非常に単純な関数を実行するだけです。この関数は次のように定義されます。AddMessage

Future AddMessage(String message);

と戻りcompleter.futureます。

渡された値messageが null の場合、関数は次のように失敗します。.completeError('Message can not be null');

Future実際のテストでは、正常に完了したかエラーが発生したかをテストしたいと考えています。したがって、これは返品をテストする方法を理解するための私の試みですFuture-問題は、このテストが失敗しないことです :(

を返す関数をテストする方法の小さなコード例を答えに書いていただけますFutureか? そして、テストでは、戻り値(成功時)をテストし、成功値が正しくない場合はテストに失敗し、別のテストが失敗すると、関数は失敗してブロックFutureに入ります。onError:

4

2 に答える 2

4

あなたの質問を読み直したところ、間違った質問に答えていたことに気づきました...

使い方expectAsyncが間違っていると思います。expectAsyncコールバックを 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);

見る:

于 2013-04-10T17:51:37.510 に答える
3

メソッドからAFutureを返すことができます。test()これにより、単体テストFutureが完了するまで待機します。

私は通常、expect()通話をthen()コールバックに入れます。例えば:

test('foo', () {
  return asyncBar().then(() => expect(value, isTrue));
});
于 2015-03-07T09:22:02.040 に答える