【问题标题】:Flutter test - verifying assets existFlutter 测试 - 验证资产是否存在
【发布时间】:2020-02-25 13:51:26
【问题描述】:

我有一个颤振应用程序,其中包含大量引用,每个引用都有一个关联的音频文件。

我编写了一个简单的测试来验证所有指定的音频文件是否在它们应该在的位置,以防出现拼写错误等:

test('specified audio file should exist for all quotes', () {
    ALL_QUOTES.forEach((quote) {
      final expectedPath = 'assets/${quote.filename}.wav';
      final exists = new File(expectedPath).existsSync();
      expect(exists, isTrue, reason: '$expectedPath does not exist');
    });
  });

这在 IntelliJ 中可以正常运行,但是使用 flutter test 从命令行运行它会在它查找的第一件事上失败。

有没有一种方法可以不管它是如何运行的?为什么它通过一种方式而不是另一种方式?

【问题讨论】:

  • 离题,但另一种解决方案是使用代码生成从您的资产中生成这样的ALL_QUOTES
  • 通常我会走这种路线,但不幸的是,在这种情况下,每个引用都有额外的元数据,例如额外的搜索词,它的“来源”是什么(例如名称的电视节目)和图像资产。

标签: testing flutter assets


【解决方案1】:

好的,所以我明白了这一点,它你可以在单元测试中做的事情。

为了诊断,我在测试中添加了 print(Directory.current); 行。在 IntelliJ 中运行,我得到 /home/project_name。在命令行中,它是/home/project_name/test。因此,只需解决一个简单的文件路径即可。

已编辑以包含 Ovidiu 用于获取正确资产路径的更简单逻辑

void main() {
  test('specified audio file should exist for all quotes', () {
    ALL_QUOTES.forEach((quote) {
      final expectedPath = 'assets/${quote.filename}.wav';
      final exists = _getProjectFile(expectedPath).existsSync();
      expect(exists, isTrue, reason: '$expectedPath does not exist');
    });
  });
}

File _getProjectFile(String path) {
  final String assetFolderPath = Platform.environment['UNIT_TEST_ASSETS'];
  return File('$assetFolderPath/$path');
}

【讨论】:

  • 我已经删除了我的答案,因为它不准确。我把事情搞混了——默认情况下,AssetManifest.json 文件不可用于单元和小部件测试,但实际资产仍然可用并且可以直接访问。此外,这是获取资产文件夹路径的一种更简洁的方法,适用于单元和小部件测试:final String assetFolderPath = Platform.environment['UNIT_TEST_ASSETS'];
  • 这对我不起作用,因为那是单元测试资产的目录。在这种情况下,我想要一个对实际应用程序使用的真实资产进行一些验证的测试。
  • 根据我的经验,它们是相同的——据我所知,没有单元测试资产这样的东西。只是作为单元和小部件测试的一部分,资产被移动到不同的目录(或至少具有不同的相对路径),这就是我上面提到的变量的帮助。
  • 是的,你是对的 - 我只是插错了。简单多了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多