是否可以测试内部代码而无需将测试代码标记为内部代码?

时间:2017-10-04 08:39:01

标签: f# xunit fscheck

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

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

1 个答案:

答案 0 :(得分:2)

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

在功能性世界中,我发现更多的是倾向于公开不供公众使用的公共功能,因此可以对它们进行测试。请参阅此comment from Edward Kmett

  

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

     

...

     

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

     

...

     

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

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

你也可以给模块一个非常难看的名字,比如__INTERNAL__,以阻止它的使用。