Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 是否可以在不必将测试代码标记为内部代码的情况下测试内部代码?_F#_Xunit_Fscheck - Fatal编程技术网

F# 是否可以在不必将测试代码标记为内部代码的情况下测试内部代码?

F# 是否可以在不必将测试代码标记为内部代码的情况下测试内部代码?,f#,xunit,fscheck,F#,Xunit,Fscheck,我有一个F#库,里面有很多我想测试的非公共内容。当前,所有不属于程序集公共API的代码都标记为内部(特别是,它放置在标记为内部)的模块中)。我使用内部visibletoattribute使此代码对我的测试程序集可见。但是,为了使测试程序集能够编译,所有在签名中使用内部类型的测试(大多数测试,因为我使用FsCheck自动生成测试输入)也必须标记为内部(这需要应用于每个函数,因为内部模块不会被xunit发现)。此外,专门用于生成FsCheck的任何类型(例如,type ValidCustomer=V

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


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

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

在功能世界中,我看到更多的倾向是只公开不用于公共用途的公共功能,以便对其进行测试。看这个

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

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

作为一种副作用,你可以使用这些新暴露的内脏进行良好的测试

在最初的评论中有更多的细节,他在一次谈话中详细讨论了这一点,但我现在找不到


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

为什么你的域类型是内部的?除非您使用的术语与(比如)领域模型大不相同,否则领域模型是应用程序中最重要的部分。这就是应用程序首先存在的原因…@MarkSeemann也许域类型是错误的术语。在这种特殊情况下,它是一个从数据仓库数据库读取数据、聚合销售数据等的单个项目,并将该数据公开给web API。API获取的数据大多是数字数据,但有相当多的内部域类型(客户、订单等)-它们正在对域进行建模,尽管它们没有在本项目之外使用。好的,但是使这些类型成为内部类型的动机是什么呢?动机是清理程序集的公共API,以避免对导入它的其他项目应该使用什么产生混淆。这在我的特殊情况下并不重要——这是一家小公司的一个小项目——但代码的某些部分仅用于程序集内部使用,我可以想象假设的(但现实的)示例,在这些示例中,引用项目B的项目a并不是自动明确的要使用projectb.IME,总是有更好的方法来解决这些问题。在OOD中,它们属于术语封装,但在FP中也可以这样做。我不能在不知道细节的情况下告诉你明确的替代方案,尽管。。。