Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 颤振';s WidgetTester.pumpAndSettle()是否不等待渲染完成?_Unit Testing_Testing_Flutter_Dart_Widget - Fatal编程技术网

Unit testing 颤振';s WidgetTester.pumpAndSettle()是否不等待渲染完成?

Unit testing 颤振';s WidgetTester.pumpAndSettle()是否不等待渲染完成?,unit-testing,testing,flutter,dart,widget,Unit Testing,Testing,Flutter,Dart,Widget,我有一个StatefulWidget哪个状态根据加载状态呈现不同的Widget(加载->加载/错误): 因此,widget tester需要等待它在initState()中设置为加载的状态,然后\u loadNotes将它移动到ListNotesLoadedState并ListNotesLoadedState.getWidget()以返回带有预期字符串的ListView(NoteItemWidgetroot和少量Text以及预期的字符串) 但是测试失败了。原因是什么(我能够在应用程序中使用测试交

我有一个
StatefulWidget
哪个状态根据加载状态呈现不同的
Widget
(加载->加载/错误):

因此,widget tester需要等待它在
initState()
中设置为加载的状态,然后
\u loadNotes
将它移动到
ListNotesLoadedState
ListNotesLoadedState.getWidget()
以返回带有预期字符串的
ListView
NoteItemWidget
root和少量
Text
以及预期的字符串)

但是测试失败了。原因是什么(我能够在应用程序中使用测试交互器并直观地看到预期的文本)?如何分析测试失败时的实际窗口小部件树

我倾向于认为WidgetTester并没有等到
Future
完成(尽管预计它会被模仿并在幕后同步,请纠正我)


你可以找到(确保调用
flatterpackages pub run build\u runner build
生成json反序列化代码)。

我找到了原因:
MaterialApp
(或者可能是任何应用程序)应该是小部件树的根

final widget = MaterialApp(home: ListNotesScreen(interactor, null)); // succeeds
而不是:

final widget = ListNotesScreen(interactor, null); // fails
此外,我还删除了未使用的
title
属性,因此测试代码与我最初使用的有点不同:

final widget = ListNotesScreen(listUseCase, null, title: 'List notes');

在中没有提到(实际上是因为这个原因吗?)尽管测试代码中有它。如果我遗漏了什么,请告诉我。

这里也有同样的问题,尽管我使用MaterialApp作为根。准确地说,层次结构是Multprovider->Consumer->MaterialApp。之所以使用这个层次结构,是因为我在Multiprovider中有一个I18nProvider,它被消费者监听,从而更新应用程序(在MaterialApp小部件内部)当语言更改时。您可以尝试在调用
pumpWidget()后调用
Wait tester.pumpAndSettle();
(甚至多次)
。在向MaterialApp添加本地化后,我的测试也开始失败。我想这是因为添加本地化会导致MaterialApp有一个额外的渲染周期。
final widget = ListNotesScreen(interactor, null); // fails
final widget = ListNotesScreen(listUseCase, null, title: 'List notes');