Flutter:如何模拟流

Lit*_*key 5 testing mocking stream flutter

I\xc2\xb4m 使用 bloc 模式,现在我来测试 UI。我的问题是:如何模拟流?\n这是我的代码:\n我向 RootPage 类提供一个可选的 mockBloc 值,如果该 mockBloc 不为 null,我会将其设置为实际的 _bloc

\n\n
class 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                     ...\n
Run 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  });\n
Run Code Online (Sandbox Code Playgroud)\n\n

我取得的结果总是得到:

\n\n
\n

方法“add”被调用为 null

\n
\n\n

什么时候_bloc.startLoad.add(null)被调用

\n

Oma*_*att 1

您可以通过使用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)