我正在尝试编写一个(小)可执行文件,使用阴谋集团进行设置,使用HSpec进行单元测试。我几乎所有的代码都在一个单独的模块中,Library
,包括main
的主体,我将其作为run
函数导入到我的主模块中
-- In src/Hecho.hs
module Main where
import Library(run)
main :: IO ()
main = run
尽管main
函数现在和我认为的一样短,但我有没有办法为它编写一个测试,比如检查它是否等于运行函数,或者以其他方式测试它?问题是我的 spec 文件定义了另一个Main
模块,我似乎无法(或者至少我不知道如何)从另一个Main
模块导入任何内容。
例如,如果我尝试以下操作
-- In test/HechoSpec.hs
module Main where
import Library
import Main
import Test.Hspec
main :: IO ()
main = hspec $ do
-- Test definitions
然后我得到错误:
Module imports form a cycle:
module `Main' (test/HechoSpec.hs) imports itself
有没有办法测试主函数?
答案:显然问题是如何确保Library.run
与main
相同。
答案是不可能做到这一点。 main
是类型 IO ()
的值,没有为 IO 操作定义Eq
。例如,此程序不键入检查:
main = print "Hello"
foo = main
fooEqualsMain = foo == main