如何测试Dart中的私有函数?

时间:2014-02-09 09:19:22

标签: dart dart-unittest

假设我在dart文件hello.dart中定义了一个私有函数:

_hello() {
  return "world";
}

我想在另一个文件mytest.dart中测试它:

library mytest;

import 'dart:unittest/unittest.dart';

main() {
  test('test private functions', () {
    expect(_hello(), equals("world"));
  }
}

但遗憾的是,测试代码无法编译。但我确实需要测试私有_hello函数。有没有解决方案?

3 个答案:

答案 0 :(得分:8)

有些人认为我们不应该直接测试私有:它应该通过公共接口进行测试。

遵循本指南的一个优点是,您的测试不会取决于您的实施。换句话说:如果你想改变你的私人而不改变你向世界揭露的东西,那么你将不必触摸你的测试。

根据这所学校的说法,如果你的私人足够重要来证明单元测试的合理性,那么在新的课程中提取它是有意义的。

将所有这些放在一起,你可以在这里做的是:

  • 使用此hello方法创建一种帮助类作为公共。然后,您可以轻松地对其进行单元测试
  • 让您当前的类使用此帮助程序类的实例
  • 测试当前类的公共方法,它依赖于_hello:如果这个私有错误,那么它应该被那些更高级别的测试所捕获

答案 1 :(得分:7)

虽然我同意私有方法/类不应该是您的测试的一部分,但是meta包确实提供了@visibleForTesting属性,如果您尝试使用以外的成员,分析器会给您一个警告它的原始库或测试。您可以像这样使用它:

import 'package:meta/meta.dart';
...
@visibleForTesting
hello() {
    return "world";
}

您的测试现在可以使用它而不会出现错误或警告,但如果其他人试图使用它,他们会收到警告。

同样,关于这样做的智慧是另一个问题 - 通常如果这是值得测试的东西,它是值得公开的东西(或者它将通过你的公共接口进行测试,这无论如何真正重要)。与此同时,您可能只想拥有严格的测试或测试驱动原则,即使对于您的私有方法/类也是如此--Dart会让您这样做。

编辑以添加:如果您正在开发库,并且将导出包含@visibleForTesting的文件,那么您实际上是在添加公共API。有人可以在分析仪关闭的情况下使用它(或者只是忽略警告),如果你以后删除它可能会破坏它们。

答案 2 :(得分:2)

建议不要将方法/类设为私有,而是将要隐藏实现细节的代码移动到 lib/src 文件夹。 此文件夹被视为私人文件夹。
我在 this section 的“测试”下的 fuchsia.dev 页面上找到了这种方法。

如果你想公开那些位于 src 文件夹中的私有方法/类,你可以将它们导出到你的 lib/main 文件中。

我试图将我的一个库 A(项目是库)导入另一个库 B,但无法导入库 A 的 src 文件夹中的代码。 根据此StackOverflow answer,仍然可以从库 B 中的 A 访问 src 文件夹。

来自dart documentation

<块引用>

如您所料,库代码位于 lib 目录下,并且对其他包是公开的。您可以根据需要在 lib 下创建任何层次结构。按照惯例,实现代码放在 lib/src 下。 lib/src 下的代码被认为是私有的;其他包永远不需要导入 src/...。要使 lib/src 下的 API 公开,您可以从直接位于 lib 下的文件中导出 lib/src 文件。