鑒于這個最小的測驗
test('ignore failures', () {
Future<void> failingFunc() async {
throw Exception('BOOOOM');
}
failingFunc();
});
測驗失敗,輸出如下:
Exception: BOOOOM
main.<fn>.<fn>.<fn>.failingFunc
test/…/auth/auth_action_bloc_test.dart:374
main.<fn>.<fn>.<fn>
test/…/auth/auth_action_bloc_test.dart:377
===== asynchronous gap ===========================
dart:async _AsyncAwaitCompleter.completeError
test/unit/features/auth/auth_action_bloc_test.dart main.<fn>.<fn>.<fn>.failingFunc
test/…/auth/auth_action_bloc_test.dart:1
main.<fn>.<fn>.<fn>
test/…/auth/auth_action_bloc_test.dart:377
不明白為什么該測驗失敗。
我的理解是這failingFunc()會“悄悄地”失敗,因為它沒有等待。(即例外將在“其他地方”拋出,而只是被忽略)我(幾乎)確定生產代碼中的這種事情會正常作業。
以下測驗確實以我期望的方式失敗(即添加await):
test('ignore failures', () async {
Future<void> failingFunc() async {
throw Exception('BOOOOM');
}
await failingFunc();
});
它按預期失敗
Exception: BOOOOM
main.<fn>.<fn>.<fn>.failingFunc
test/…/auth/auth_action_bloc_test.dart:374
main.<fn>.<fn>.<fn>
test/…/auth/auth_action_bloc_test.dart:377
uj5u.com熱心網友回復:
例外將在其他地方拋出,但肯定不會被忽略。
一個未捕獲的異步錯誤,即,被報告給當前Zone的未捕獲的錯誤處理程式。如果你沒有做任何特別的事情,那就是根區,它會在出現未捕獲的錯誤時終止程式。
嗯,它會在本機代碼中這樣做。在 Web 上,您無法使瀏覽器崩潰,因此它只會被視為未處理的 JavaScript 錯誤,可能會或可能不會被忽略。它仍然是糟糕的風格,并且使除錯變得更加困難,因此您不應該讓錯誤在生產中得不到處理。
該test包在新區域中使用未捕獲的錯誤處理程式運行每個測驗,因此它知道哪個測驗導致了例外。它還認識到錯誤發生在它已經認為測驗已經完成并成功之后。如果幸運的話,它會回傳并將測驗標記為因拋出該錯誤而失敗,即使它在很晚之后才這樣做。如果不幸且緩慢,并且所有測驗都已完成并且測驗運行器已列印結果,那么回傳并更改結果可能為時已晚。
例子:
import "package:test/test.dart";
void main() {
test("example", () {
Future.delayed(Duration(seconds: 1), () => throw "error");
});
test("delayed", () => Future.delayed(Duration(seconds: 2)));
}
在此示例中,test包識別出"example"測驗失敗,即使它在回傳并假裝一切正常之后仍然這樣做。如果您將 的持續時間更改"delayed"為零,那么它會報告兩個測驗都成功,在第一個測驗未捕獲的錯誤發生之前,它只列印00:00 2: All tests passed!.
如果你真的想忽略未來的錯誤,你必須做一些事情。從 Dart 2.14 開始,你可以這樣寫:
failingFunc().ignore();
這ignore()是一個Future在dart:async/dart:core中宣告的擴展方法,它捕獲并忽略它被呼叫的未來的錯誤。小心使用,錯誤可能很大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367331.html
