函数隐私和unit testingHaskell
你如何处理Haskell中的函数可见性和unit testing?
如果您导出模块中的每个函数,以便unit testing可以访问它们,则可能导致其他人调用不应该在公共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
然后,您可以在testing中导入SomeModule.Internal
,并在其中可以访问内部实现的关键位置导入SomeModule.Internal
。
这个想法是,你的库的用户不会不小心调用私有API,但如果知道他们在做什么(debugging等),他们可以使用它。 与强制隐藏私有API相比,这极大地增加了您的库的可用性。
为了进行testing,通常将应用程序拆分到cabal项目文件中,库,生产可执行文件和testing库函数的testing套件可执行文件之间,以便将testing断言function分开。
对于外部function可见性,可以在“exposed-modules”部分和“other-modules”部分之间拆分库模块。