失败的' assert '不抛出' AssertionError '与null-safety,任何解决方案?



当我开始转换到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输出错误

名称'_AssertionError'没有定义,所以它不能在"是"的表情。尝试将名称更改为现有的名称类型,或者创建一个名为'_AssertionError'的类型。


请避免回答you are not supposed to catch errors
下面的代码纯粹是演示性的
,我在编写测试时遇到了问题while expect(fun(), throwsA(AssertionError));已包含在代码示例中,它将不适合我的用例


这不是一个bug,而是一个预期的行为,见issue 45191

您不应该期望assert(false)抛出一个运行时类型为AssertionError的对象,它只能保证抛出一个可类型的对象(即,一个运行时类型是AssertionError的子类型的对象),这可能就是测试expect(type, AssertionError);失败的原因。


我的医生和我的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);失败的原因。

最新更新