Flutter 测试中的插件
几乎所有Flutter 插件都包含两部分:
- Dart 代码,提供你的代码调用的 API。
- 使用特定平台(或“主机”)语言编写的代码,例如 Kotlin 或 Swift,用于实现这些 API。
事实上,原生(或主机)语言代码将插件包与标准包区分开来。
构建和注册插件的主机部分是 Flutter 应用程序构建过程的一部分,因此插件仅在你的代码在你的应用程序中运行时才有效,例如使用 flutter run
或运行集成测试 时。运行Dart 单元测试 或widget 测试 时,主机代码不可用。如果要测试的代码调用任何插件,这通常会导致如下错误:
MissingPluginException(No implementation found for method someMethodName on channel some_channel_name)
在单元测试使用插件的代码时,有几种方法可以避免此异常。以下解决方案按优先级顺序列出。
包装插件
#在大多数情况下,最佳方法是将插件调用包装在您自己的 API 中,并在测试中提供一种模拟您自己的 API 的方法。
这有几个优点:
- 如果插件 API 发生更改,则无需更新测试。
- 你只测试你自己的代码,因此你的测试不会因为你使用的插件的行为而失败。
- 无论插件是如何实现的,或者甚至是对于非插件包依赖项,你都可以使用相同的方法。
模拟插件的公共 API
#如果插件的 API 已经基于类实例,你可以直接模拟它,但有以下警告:
- 如果插件使用非类函数或静态方法,则此方法无效。
- 插件 API 更改时,需要更新测试。
模拟插件的平台接口
#如果插件是联合插件,它将包含一个平台接口,允许注册其内部逻辑的实现。你可以注册该平台接口实现的模拟,而不是使用公共 API,但有以下警告:
- 如果插件不是联合插件,则此方法无效。
- 你的测试将包含插件代码的一部分,因此插件行为可能会导致你的测试出现问题。例如,如果插件在内部缓存中写入文件,则你的测试行为可能会根据你之前是否运行过测试而改变。
- 平台接口更改时,可能需要更新测试。
这可能需要的一个示例是模拟由你依赖的包(而不是你自己的代码)使用的插件的实现,因此你无法更改其调用方式。但是,如果可能,你应该模拟使用该插件的依赖项。
模拟平台通道
#如果插件使用平台通道,你可以使用TestDefaultBinaryMessenger
模拟平台通道。只有在某种原因导致上述方法都不可用时才应使用此方法,因为它有几个缺点:
- 只有使用平台通道的实现才能被模拟。这意味着,如果某些实现不使用平台通道,则你的测试在某些平台上运行时会意外地使用真实的实现。
- 平台通道通常是插件的内部实现细节。即使是插件的错误修复更新也可能对其进行大幅更改,从而意外地破坏你的测试。
- 每个联合插件的实现中的平台通道可能有所不同。例如,你可能会设置模拟平台通道以使测试在 Windows 机器上通过,然后发现如果在 macOS 或 Linux 上运行则会失败。
- 平台通道不是强类型的。例如,方法通道通常使用字典,你必须阅读插件的实现才能知道键字符串和值类型是什么。
由于这些限制,TestDefaultBinaryMessenger
主要用于插件实现的内部测试,而不是使用插件的代码测试。
你可能还想查看插件测试。
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。