4

我有一个 F# 库,里面有很多我想测试的非公开内容。目前,所有不属于程序集公共 API 的代码都被标记internal(具体来说,它被放置在被标记的模块中internal)。我使用InternalsVisibleToAttribute使此代码对我的测试程序集可见。但是,为了编译测试程序集,所有在其签名中使用内部类型的测试(其中大多数,因为我使用 FsCheck 自动生成测试输入)也必须标记为内部(这需要应用于每个函数,因为 xunit 不会发现内部模块)。此外,专门用于 FsCheck 生成的任何类型(例如type ValidCustomer = ValidCustomer of CustomerCustomer是我的内部域类型)也需要标记为内部,并且 FsCheck 在创建内部类型时似乎卡住了,因此测试不运行。

有什么方法可以测试内部 F# 代码(来自单独的测试程序集),而不必将签名依赖于内部类型的所有测试标记为内部?现在我只是倾向于在原始代码中根本不做任何内部事情,但理想情况下,有一种方法可以让我的干净 API 蛋糕也吃掉。

4

1 回答 1

2

我发现 OO 世界通常会非常反对尝试直接测试任何内部/私有的东西。

在功能世界中,我看到更多的趋势是公开不打算供公众使用的公共功能,以便对其进行测试。请参阅Edward Kmett 的此评论。

当我开始编写 Haskell 时,我开始重新思考我过去处理封装和隐藏的方式。

...

一般来说,我非常喜欢通过某种 .Internal 模块公开所有重要的细节、构造函数和我的数据类型的所有内容,即使我希望在 API 的其余部分中进行封装和安全。

...

作为其副作用,您可以使用这些新暴露的胆量进行良好的测试。=)

原始评论中有更多细节,并且有一次谈话,他详细讨论了这个问题,但我现在找不到。

您还可以给模块起一个非常难看的名称,__INTERNAL__以阻止它的使用。

于 2017-10-04T09:46:45.753 回答