带有回调函数的Flutter自定义widget测试失败



我已经实现了一个自定义小部件,我正在尝试为它创建测试用例。下面是我的自定义小部件。它有一个onObserve方法。所以当控制器检测到一些数据时,它调用onObserve方法。

class CustomWidget extends StatefulWidget {
final ValueChanged<Model>? onObserve;
const CustomWidget({super.key, required this.onObserve});
@override
State<CustomWidget> createState() => _CustomWidgetState();
}
class _CustomWidgetState extends State<CustomWidget> {
@override
Widget build(BuildContext context) {
MyController mController = MyController();
return Stack(
children: [
Center(
child: SizedBox(
width: 350,
height: 350,
child: MyObserver(
controller: mController,
onDetect: (code, args) {
if (code.value != null) {
//...TODO
widget.onObserve!(myObservedData);
}
}),
),
),
],
);
}
}
下面是我的测试用例:
testWidgets('on observe', (WidgetTester tester) async {
var mModel = Model();
await tester.pumpWidget(MyWrapper(Scaffold(body: CustomWidget(
onObserve: (value) {
value.address = '5, ABC-123';
mModel = value;
},
))));
await tester.pumpAndSettle();
expect(find.byType(CustomWidget), findsOneWidget);
expect(find.byType(MyObserver), findsOneWidget);
expect(mModel.address, '5, ABC-123');
await tester.pumpAndSettle();
});

这个测试用例总是失败,因为它没有进入onObserve方法。我要做的是在onObserve方法中设置数据,并与总是失败的expect(mModel.address, '5, ABC-123');进行验证。以上测试有什么问题吗?

如果我理解正确,MyObserveonDetect只会在发生某事时触发

await tester.pumpWidget(MyWrapper(Scaffold(body: CustomWidget(
onObserve: (value) {
value.address = '5, ABC-123';
mModel = value;
},
))));
await tester.pumpAndSettle();

以上部分的代码只await为您的CustomWidget构建完成,它不等待onDetect被触发,所以onObserve内的代码将不会被调用我不知道你的MyObserve做什么,所以我用这个例子,你可以按照它:

testWidgets('on observe', (WidgetTester tester) async {
var mModel;
await tester.pumpWidget(MyWrapper(
home: Scaffold(body: CustomWidget(
onObserve: (value) {
mModel = value;
},
)),
));
// You maybe need to implement code to trigger your MyObserve class here
final CustomWidgetState customWidgetState = tester.state(find.byType(CustomWidget));
customWidgetState.triggerOnDetect();
await tester.pumpAndSettle();
expect(find.byType(CustomWidget), findsOneWidget);
expect(mModel, 123);
}); 

最新更新