Flutter插件单元测试中MethodCall列表的用途

时间:2019-06-25 02:34:32

标签: plugins flutter dart flutter-platform-channel

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

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>的{​​{1}}。这是example

log

我了解使用 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'], )); }); 进行的模拟,但是为什么只使用一个时可以使用MethodCall列表呢?如果只是一种情况,我可能不会特别注意,但是我会在源代码中一遍又一遍地看到这种模式。

1 个答案:

答案 0 :(得分:2)

我认为重点是要验证方法调用处理程序是否仅被触发了一次(并因此被正确地添加(“记录”)到List<MethodCall>中的一个条目)。如果只是一个MethodCall变量(从null变为非null),那么验证该变量没有被多次触发将不太容易。