如何为 Shake 规则或操作编写 "unit" 测试?

How can I write "unit" tests for Shake rules or actions?

我正在为 Shake 编写专门的规则和预言机,我想为这些功能编写测试。我怎样才能在 Shake 中做到这一点?我没有找到任何可以完成这项工作的简单易用的 actionToIO 函数。

例如,我想测试以下行为:

checkGitWorkDirIsClean = do
  Stdout out <- cmd "git" [ "status", "-s", "-uno" ]
  pure $ null $ filter (/= "") (lines out)

所以我可以创建包含简约 git 数据的准备目录并针对这些目录测试功能。

一般来说,测试构建系统很难。 Shake 有 various linting related features 这可能是构建整个构建系统的最佳方式。

为了测试小片段,最好在 IO 而不是 Action 中制作它们。在上面的例子中,cmdActionIO monad 中都可以是 运行,所以在 IO 中测试它可能更容易。

如果您在 Action 中确实有片段,通过 Shake 构建系统驱动它的唯一方法是使用类似 shake 函数的东西。如果你想以一致的方式这样做,通常将 shakeFiles 设置为 /dev/null 可能会有用,因为这会导致 Shake 不写入数据库,因此每个 运行 将是尽管 Shake 是从零开始的。