假设我在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
函数。有没有解决方案?
答案 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 文件夹。
<块引用>如您所料,库代码位于 lib 目录下,并且对其他包是公开的。您可以根据需要在 lib 下创建任何层次结构。按照惯例,实现代码放在 lib/src 下。 lib/src 下的代码被认为是私有的;其他包永远不需要导入 src/...。要使 lib/src 下的 API 公开,您可以从直接位于 lib 下的文件中导出 lib/src 文件。