2

令我震惊的是,我真的不知道用黑盒测试与 Cabal 打包的可执行文件的方法。

例如,我可以运行任意 shell 命令,并且我当然可以连接它npm,以便转换和执行必要的源代码,并检查它们的副作用。

Stack (如此所述)构建可执行文件并将它们发布到$PATH测试套件中,因此我可以轻松运行它们。

但是对于 Cabal,测试套件显然甚至不能依赖于可执行文件,因此无法强制构建后者。(我错了吗?)即使那样,我也必须知道编译后的二进制文件的路径。

我该如何解决这个问题?

我的情况的细节是可执行文件必须广泛分析系统的状态并相应地分支,我想进行集成测试以确保它不会忘记这样做。

另请注意,我不喜欢IO直接运行相关功能,因为我发现它不够集成。或者,更确切地说,我希望能够运行单个IO函数并作为一个整体运行程序。就我而言,已经有测试 shell 脚本到位,但我真的很想“把它们烤进去”。

4

1 回答 1

4

事实证明,至少目前,使用新的(ish)build-tool-dependsCabal 领域有一种(有点笨拙的)方法可以做到这一点。有一些讨论(https://github.com/haskell/cabal/issues/5411https://github.com/haskell/cabal/pull/4104#issuecomment-266838873build-tool-depends仅在构建时可用,并且有一个单独的字段用于运行组件时应该可用的可执行文件。但是,这个单独的运行时工具依赖字段还不存在。幸运的是,Cabal(至少 2.1 和 2.2)似乎完全没有这种区别:在运行测试套件build-tool-depends时,列出的可执行文件实际上是可用的。cabal new-test这意味着您可以使用pkg.cabal如下所示的文件:

name: pkg
executable exe
  ...
test-suite test
  ...
  build-tool-depends: pkg:exe

当您运行测试套件时,可执行文件将在路径上构建。

于 2018-07-07T18:51:55.297 回答