繁体   English   中英

功能隐私和单元测试Haskell

[英]Function privacy and unit testing Haskell

你如何处理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相比,这大大增加了库的可用性。

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

对于外部功能可见性,您可以在“exposed-modules”部分和“other-modules”部分之间拆分库模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM