Lit*_*key 5 testing mocking stream flutter
I\xc2\xb4m 使用 bloc 模式,现在我来测试 UI。我的问题是:如何模拟流?\n这是我的代码:\n我向 RootPage 类提供一个可选的 mockBloc 值,如果该 mockBloc 不为 null,我会将其设置为实际的 _bloc
\n\nclass RootPage extends StatefulWidget {\n\n final loggedOut;\n final mockBlock;\n RootPage(this.loggedOut, {this.mockBlock});\n\n @override\n _RootPageState createState() => _RootPageState();\n}\n\n\nclass _RootPageState extends State<RootPage> {\n\n LoginBloc _bloc;\n\n @override\n void initState() {\n super.initState();\n if (widget.mockBlock != null)\n _bloc = widget.mockBlock;\n else\n _bloc = new LoginBloc();\n if (widget.loggedOut == false)\n _bloc.startLoad.add(null);\n }\n\n ...\n\n @override\n Widget build(BuildContext context) {\n return StreamBuilder(\n stream: _bloc.load,\n builder: (context, snapshot) {\n if (snapshot.hasData) {\n return Column(\n children: <Widget>\n ...\nRun Code Online (Sandbox Code Playgroud)\n\n这是我\xc2\xb4ve 尝试过的:
\n\n testWidgets(\'MyWidget\', (WidgetTester tester) async {\n MockBloc mockBloc = new MockBloc();\n MockTokenApi mockTokenApi = new MockTokenApi();\n\n await tester.pumpWidget(new MaterialApp(\n home: RootPage(false, mockBlock: mockBloc)));\n\n when(mockBloc.startLoad.add(null)).thenReturn(mockBloc.insertLoadStatus.add(SettingsStatus.set)); //this will give in output the stream that the StreamBuilder is listening to (_bloc.load)\n });\n await tester.pump();\n expect(find.text("Root"), findsOneWidget);\n\n });\nRun Code Online (Sandbox Code Playgroud)\n\n我取得的结果总是得到:
\n\n\n\n\n方法“add”被调用为 null
\n
什么时候_bloc.startLoad.add(null)被调用
您可以通过使用mockito创建模拟类来创建模拟流。以下是有关如何实施的示例。
import 'package:mockito/mockito.dart';
class MockStream extends Mock implements Stream<int> {}
void main() async {
var stream = MockStream();
when(stream.first).thenAnswer((_) => Future.value(7));
print(await stream.first);
when(stream.listen(any)).thenAnswer((Invocation invocation) {
var callback = invocation.positionalArguments.single;
callback(1);
callback(2);
callback(3);
});
stream.listen((e) async => print(await e));
}
Run Code Online (Sandbox Code Playgroud)