Трепетать, как смоделировать вызов rootBundle.loadString (...), а затем сбросить смоделированное поведение? - PullRequest
3 голосов
/ 05 февраля 2020

В моем коде флаттера у меня есть логика c, которая делает это:

final jsonString = await rootBundle.loadString('AssetManifest.json');

И у меня есть тесты, которые я хочу вернуть подделкой AssetManifest.json, когда эта строка достигнута.

Чтобы сделать это, я делаю это в тесте:

ServicesBinding.instance.defaultBinaryMessenger
    .setMockMessageHandler('flutter/assets', (message) {
  final Uint8List encoded =
      utf8.encoder.convert('{"Foo.ttf":["Foo.ttf"]}');
  return Future.value(encoded.buffer.asByteData());
});

Странно то, что работает , но любые тесты, которые запускаются после этого зависание (все они застряли в коде, когда он достигает строки await rootBundle.loadString('AssetManifest.json').

Я пытался добавить

ServicesBinding.instance.defaultBinaryMessenger
    .setMockMessageHandler('flutter/assets', null);

Но, похоже, это не совсем "очищает" по сути, если я запускаю вышеуказанную строку в моем setUp, первый тест для запуска зависает.

Итак, я ошибаюсь в поведении? Или нет? чистить его правильно?

1 Ответ

0 голосов
/ 16 апреля 2020

Я столкнулся с той же проблемой и считаю, что это связано с кэшированием в комплекте. Это приведет к сбою вышеуказанного теста, потому что сообщение никогда не отправляется. При вызове loadString вы можете указать, следует ли кэшировать результат. Например, loadString('AssetManifest.json', false).

Обратите внимание, что если вы используете loadStructuredData, реализации могут кэшировать результат, а вы не можете сказать, что нет.

...