Назначение списка MethodCall в модульных тестах плагина Flutter

Настройка модульного теста по умолчанию при создании плагина выглядит следующим образом:

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, Вот пример:

  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, но зачем использовать список MethodCall, когда вы можете просто использовать один? Если бы это был всего лишь один случай, я бы не обращал на это большого внимания, но я вижу шаблон снова и снова в исходном коде.

1 ответ

Решение

Я считаю, что дело в том, чтобы убедиться, что обработчик вызова метода был запущен ровно один раз (и, следовательно, добавлен ("зарегистрирован") ровно одна запись в List<MethodCall>). Если бы это было просто MethodCall переменная, которая изменилась с null не-nullпроверить, что это не было вызвано несколько раз, было бы не так просто.

Другие вопросы по тегам