35

假设我在 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函数。有什么解决办法吗?

4

3 回答 3

31

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

import 'package:meta/meta.dart';

@visibleForTesting
String hello() {
  return "world";
}

您的测试现在可以在没有错误或警告的情况下使用它,但如果其他人尝试使用它,他们会收到警告。

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

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

于 2018-05-03T18:42:59.187 回答
17

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

遵循本指南的一个优点是您的测试将不依赖于您的实施。换种说法:如果你想改变你的私人而不改变你暴露给世界的东西,那么你就不必碰你的测试。

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

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

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

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

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

我试图将我的一个库 A(项目是库)导入另一个库 B,但无法导入库 A 的 src 文件夹中的代码。根据这个StackOverflow 答案,仍然可以从A 在图书馆 B.

飞镖文档

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

于 2021-03-17T15:25:25.933 回答