testパッケージのexpectとexpectLaterで非同期処理(例:Future)を検証するときのサンプルコード
基本的な方法
import 'package:test/test.dart';
void main() {
test('should return 1 (expect)', () {
expect(Future.value(1), completion(1));
});
test('should return 1 (expectLater)', () {
expectLater(Future.value(1), completion(1));
});
}
-
Future
の検証はexpect
でもexpectLater
でも可能 -
matcher
には非同期処理用のものを指定する(completionやthrowsAなど)-
equalsは
actual
の値それ自体(サンプルではFuture<int>
)との比較をするため、非同期処理の検証で使っても期待通りの動きはしない-
import 'package:test/test.dart'; void main() { test('should return 1 (fails)', () { expect(Future.value(1), equals(1)); // Expected: <1> // Actual: <Instance of 'Future<int>'> }); }
-
-
equalsは
expect
とexpectLater
の違うところ、同じところ
import 'package:test/test.dart';
void main() {
test('"waiting" should be printed BEFORE "done" 1', () {
expect(
Future.delayed(const Duration(seconds: 5), () {
print('done');
return 1;
}),
completion(1),
);
print('waiting');
// waiting
// done
});
test('"waiting" should be printed BEFORE "done" 2', () async {
expectLater(
Future.delayed(const Duration(seconds: 5), () {
print('done');
return 1;
}),
completion(1),
);
print('waiting');
// waiting
// done
});
test('"waiting" should be printed AFTER "done"', () async {
await expectLater(
Future.delayed(const Duration(seconds: 5), () {
print('done');
return 1;
}),
completion(1),
);
print('waiting');
// done
// waiting
});
}
-
expect
とexpectLater
で違うところは、非同期処理の検証完了を待てるかどうか-
expect
はvoid
を返すため、待つことができない -
expectLater
は検証が終わると完了するFuture
を返すため、await
と一緒に使うことで検証完了を待つことができる
-
-
expect
とexpectLater
で同じところは、非同期処理の検証が完了するまで次のtest
が実行されないこと- サンプルコートで言うと、
"waiting" should be printed BEFORE "done" 1
の中で検証がすべて完了するまで"waiting" should be printed BEFORE "done" 2
の実行は始まらない- また、
"waiting" should be printed BEFORE "done" 2
の中で検証がすべて完了するまで"waiting" should be printed AFTER "done"
の実行は始まらない
- また、
- サンプルコートで言うと、
サンプルコードのまとめ