函数隐私和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”部分之间拆分库模块。

    Interesting Posts