创建插件时的默认单元测试设置如下所示:

void main() {
  const MethodChannel channel = MethodChannel(
      'com.example/my_plugin');

  setUp(() {
    channel.setMockMethodCallHandler((MethodCall methodCall) async {
      return '42';
    });
  });

  tearDown(() {
    channel.setMockMethodCallHandler(null);
  });

  test('getPlatformVersion', () async {
    expect(await MyPlugin.platformVersion, '42');
  });
}

但是,在许多源代码中,我看到人们使用称为List<MethodCall>log。这是一个example:
  test('setPreferredOrientations control test', () async {
    final List<MethodCall> log = <MethodCall>[];

    SystemChannels.platform.setMockMethodCallHandler((MethodCall methodCall) async {
      log.add(methodCall);
    });

    await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
      DeviceOrientation.portraitUp,
    ]);

    expect(log, hasLength(1));
    expect(log.single, isMethodCall(
      'SystemChrome.setPreferredOrientations',
      arguments: <String>['DeviceOrientation.portraitUp'],
    ));
  });

我了解setMockMethodCallHandler的 mock ,但是为什么只使用一个时可以使用MethodCall列表呢?如果只是一种情况,我可能不会特别注意,但是我在源代码中一遍又一遍地看到了这种模式。

最佳答案

我认为关键是要验证方法调用处理程序是否仅被触发一次(并因此在List<MethodCall>中添加(“记录”)了一个条目)。如果只是一个从MethodCall变为non-nullnull变量,那么验证它没有被多次触发将不那么简单。

09-04 12:17