失败的 `assert` 不会在空安全的 dart 中抛出 `AssertionError`,有什么解决方法吗?
failed `assert` does not throw `AssertionError` in dart with null-safety, any workaround?
我一开始过渡到 null-safety
我遇到了这个问题:
运行下面的测试
// ignore_for_file: avoid_catching_errors
import 'package:test/test.dart';
void main() {
test(
'WHEN `AssertionError` is thrown '
'THEN `Error` is `AssertionError`'
'', () {
Type? type;
void fun() => throw AssertionError();
try {
fun();
} on Error catch (e) {
if (e is AssertionError) {
type = e.runtimeType;
}
}
expect(type, AssertionError);
});
test('WHEN `assertion` fails THEN throw `AssertionError`', () {
Type? type;
void fun() {
assert(false);
}
try {
fun();
} on Error catch (e) {
if (e is AssertionError) {
type = e.runtimeType;
}
}
expect(type, AssertionError);
});
test('WHEN `assertion fails THEN throwsA(AssertionError) should be true', () {
bool fun() {
assert(false);
return true;
}
expect(fun, throwsA(isA<AssertionError>()));
});
}
输出以下日志
00:00 +0: loading test/widget_test.dart
00:01 +0: loading test/widget_test.dart
00:01 +0: test/widget_test.dart: WHEN `AssertionError` is thrown THEN `Error` is `AssertionError`
00:01 +1: test/widget_test.dart: WHEN `AssertionError` is thrown THEN `Error` is `AssertionError`
00:01 +1: test/widget_test.dart: WHEN `assertion` fails THEN throw `AssertionError`
00:01 +1 -1: test/widget_test.dart: WHEN `assertion` fails THEN throw `AssertionError` [E]
Expected: Type:<AssertionError>
Actual: Type:<_AssertionError>
package:test_api expect
test/widget_test.dart 39:5 main.<fn>
00:01 +1 -1: test/widget_test.dart: WHEN `assertion fails THEN throwsA(AssertionError) should be true
00:01 +2 -1: test/widget_test.dart: WHEN `assertion fails THEN throwsA(AssertionError) should be true
00:01 +2 -1: Some tests failed.
pub failed (1; 00:01 +2 -1: Some tests failed.
)
请注意,尝试使用 _AssertionError
会输出错误
The name '_AssertionError' isn't defined, so it can't be used in an
'is' expression. Try changing the name to the name of an existing
type, or creating a type with the name '_AssertionError'.
请避免回答you are not supposed to catch errors
下面的代码纯粹是示范性的
我遇到了编写测试的问题
while expect(fun(), throwsA(AssertionError));已包含在代码示例中,它不适合我的用例
这不是错误,而是预期的行为,请参阅 issue 45191
You shouldn't expect assert(false)
to throw an object whose run-time type is AssertionError
, it is only guaranteed to throw an object which is typable as such (that is, an object whose run-time type is a subtype of AssertionError
), and that's probably the reason why the test expect(type, AssertionError);
fails.
下面是我的医生和我的 pubspec
[✓] Flutter (Channel master, 2.1.0-11.0.pre.97, on Linux, locale en_US.UTF-8)
• Flutter version 2.1.0-11.0.pre.97 at /home/francesco/snap/flutter/common/flutter
• Framework revision c14c8d8177 (2 hours ago), 2021-03-03 21:40:34 -0800
• Engine revision 72bbc5d92c
• Dart version 2.13.0 (build 2.13.0-93.0.dev)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
• Android SDK at /home/francesco/Android/Sdk
• Platform android-30, build-tools 30.0.2
• ANDROID_SDK_ROOT = /home/francesco/Android/Sdk
• Java binary at: /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_282-8u282-b08-0ubuntu1~20.04-b08)
• All Android licenses accepted.
[✓] Chrome - develop for the web
• CHROME_EXECUTABLE = /snap/bin/chromium
[✓] Linux toolchain - develop for Linux desktop
• clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
• cmake version 3.10.2
• ninja version 1.8.2
• pkg-config version 0.29.1
[!] Android Studio (not installed)
• Android Studio not found; download from https://developer.android.com/studio/index.html
(or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).
[✓] Connected device (2 available)
• Linux (desktop) • linux • linux-x64 • Linux
• Chrome (web) • chrome • web-javascript • Chromium 89.0.4389.72 snap
! Doctor found issues in 1 category.
francesco@francesco-yoga720:~/project
name: issue
description: A new Flutter project.
version: 1.0.0+1
environment:
sdk: '>=2.12.0 <3.0.0'
dev_dependencies:
test: ^1.16.5
你不应该期望 assert(false)
抛出一个 运行 时间类型为 AssertionError
的对象,它只能保证抛出一个可类型化的对象(即是 运行 时间类型是 AssertionError
的子类型的对象),这可能是测试 expect(type, AssertionError);
失败的原因。
我一开始过渡到 null-safety
我遇到了这个问题:
运行下面的测试
// ignore_for_file: avoid_catching_errors
import 'package:test/test.dart';
void main() {
test(
'WHEN `AssertionError` is thrown '
'THEN `Error` is `AssertionError`'
'', () {
Type? type;
void fun() => throw AssertionError();
try {
fun();
} on Error catch (e) {
if (e is AssertionError) {
type = e.runtimeType;
}
}
expect(type, AssertionError);
});
test('WHEN `assertion` fails THEN throw `AssertionError`', () {
Type? type;
void fun() {
assert(false);
}
try {
fun();
} on Error catch (e) {
if (e is AssertionError) {
type = e.runtimeType;
}
}
expect(type, AssertionError);
});
test('WHEN `assertion fails THEN throwsA(AssertionError) should be true', () {
bool fun() {
assert(false);
return true;
}
expect(fun, throwsA(isA<AssertionError>()));
});
}
输出以下日志
00:00 +0: loading test/widget_test.dart
00:01 +0: loading test/widget_test.dart
00:01 +0: test/widget_test.dart: WHEN `AssertionError` is thrown THEN `Error` is `AssertionError`
00:01 +1: test/widget_test.dart: WHEN `AssertionError` is thrown THEN `Error` is `AssertionError`
00:01 +1: test/widget_test.dart: WHEN `assertion` fails THEN throw `AssertionError`
00:01 +1 -1: test/widget_test.dart: WHEN `assertion` fails THEN throw `AssertionError` [E]
Expected: Type:<AssertionError>
Actual: Type:<_AssertionError>
package:test_api expect
test/widget_test.dart 39:5 main.<fn>
00:01 +1 -1: test/widget_test.dart: WHEN `assertion fails THEN throwsA(AssertionError) should be true
00:01 +2 -1: test/widget_test.dart: WHEN `assertion fails THEN throwsA(AssertionError) should be true
00:01 +2 -1: Some tests failed.
pub failed (1; 00:01 +2 -1: Some tests failed.
)
请注意,尝试使用 _AssertionError
会输出错误
The name '_AssertionError' isn't defined, so it can't be used in an 'is' expression. Try changing the name to the name of an existing type, or creating a type with the name '_AssertionError'.
请避免回答you are not supposed to catch errors
下面的代码纯粹是示范性的
我遇到了编写测试的问题
while expect(fun(), throwsA(AssertionError));已包含在代码示例中,它不适合我的用例
这不是错误,而是预期的行为,请参阅 issue 45191
You shouldn't expect
assert(false)
to throw an object whose run-time type isAssertionError
, it is only guaranteed to throw an object which is typable as such (that is, an object whose run-time type is a subtype ofAssertionError
), and that's probably the reason why the testexpect(type, AssertionError);
fails.
下面是我的医生和我的 pubspec
[✓] Flutter (Channel master, 2.1.0-11.0.pre.97, on Linux, locale en_US.UTF-8)
• Flutter version 2.1.0-11.0.pre.97 at /home/francesco/snap/flutter/common/flutter
• Framework revision c14c8d8177 (2 hours ago), 2021-03-03 21:40:34 -0800
• Engine revision 72bbc5d92c
• Dart version 2.13.0 (build 2.13.0-93.0.dev)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
• Android SDK at /home/francesco/Android/Sdk
• Platform android-30, build-tools 30.0.2
• ANDROID_SDK_ROOT = /home/francesco/Android/Sdk
• Java binary at: /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_282-8u282-b08-0ubuntu1~20.04-b08)
• All Android licenses accepted.
[✓] Chrome - develop for the web
• CHROME_EXECUTABLE = /snap/bin/chromium
[✓] Linux toolchain - develop for Linux desktop
• clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
• cmake version 3.10.2
• ninja version 1.8.2
• pkg-config version 0.29.1
[!] Android Studio (not installed)
• Android Studio not found; download from https://developer.android.com/studio/index.html
(or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).
[✓] Connected device (2 available)
• Linux (desktop) • linux • linux-x64 • Linux
• Chrome (web) • chrome • web-javascript • Chromium 89.0.4389.72 snap
! Doctor found issues in 1 category.
francesco@francesco-yoga720:~/project
name: issue
description: A new Flutter project.
version: 1.0.0+1
environment:
sdk: '>=2.12.0 <3.0.0'
dev_dependencies:
test: ^1.16.5
你不应该期望 assert(false)
抛出一个 运行 时间类型为 AssertionError
的对象,它只能保证抛出一个可类型化的对象(即是 运行 时间类型是 AssertionError
的子类型的对象),这可能是测试 expect(type, AssertionError);
失败的原因。