您如何处理 Haskell 中的功能可见性和单元测试?
如果您导出模块中的每个函数以便单元测试可以访问它们,那么您可能会冒着其他人调用不应在公共 API 中的函数的风险。
我想过使用{-# LANGUAGE CPP #-}
然后用一个围绕出口#ifdef
:
{-# LANGUAGE CPP #-}
module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where
有没有更好的办法?
您如何处理 Haskell 中的功能可见性和单元测试?
如果您导出模块中的每个函数以便单元测试可以访问它们,那么您可能会冒着其他人调用不应在公共 API 中的函数的风险。
我想过使用{-# LANGUAGE CPP #-}
然后用一个围绕出口#ifdef
:
{-# LANGUAGE CPP #-}
module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where
有没有更好的办法?
通常的约定是将您的模块分成公共和私有部分,即
module SomeModule.Internal where
-- ... exports all private methods
然后是公共 API
module SomeModule where (export1, export2)
import SomeModule.Internal
SomeModule.Internal
然后,您可以在测试和其他对访问内部实现至关重要的地方导入。
这个想法是您的库的用户永远不会意外调用私有 API,但如果知道他们在做什么(调试等) ,他们可以使用它。与强制隐藏私有 API 相比,这大大提高了库的可用性。