46

您如何处理 Haskell 中的功能可见性和单元测试?

如果您导出模块中的每个函数以便单元测试可以访问它们,那么您可能会冒着其他人调用不应在公共 API 中的函数的风险。

我想过使用{-# LANGUAGE CPP #-}然后用一个围绕出口#ifdef

{-# LANGUAGE CPP #-}

module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where

有没有更好的办法?

4

2 回答 2

74

通常的约定是将您的模块分成公共和私有部分,即

module SomeModule.Internal where

-- ... exports all private methods

然后是公共 API

module SomeModule where (export1, export2)

import SomeModule.Internal

SomeModule.Internal然后,您可以在测试和其他对访问内部实现至关重要的地方导入。

这个想法是您的库的用户永远不会意外调用私有 API,但如果知道他们在做什么(调试等) ,他们可以使用它。与强制隐藏私有 API 相比,这大大提高了库的可用性。

于 2013-01-17T12:44:44.360 回答
8

对于测试,您通常在cabal项目文件中将应用程序拆分为库、生产可执行文件和测试库函数的测试套件可执行文件,因此测试断言函数是分开的。

对于外部函数可见性,您将库模块拆分为“exposed-modules”部分和“other-modules”部分。

于 2013-01-17T12:49:37.473 回答