测试文件系统代码

时间:2013-09-28 22:29:00

标签: unit-testing clojure midje

使用Midje进行单元测试是一种很棒的体验,但现在我需要测试一些与filessytem交互的代码。具体来说,代码从本地目录布局构建数据结构表示。

想到的是在/ tmp中创建目录和文件,然后必须在测试后清理它们。我可能会让它发挥作用,但如果有正确的方法可以做得更好。

在Clojure中或更常见的情况下,测试文件系统代码的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

我不确定是否有特定的东西可以帮助你处理文件系统的东西,但可以使用backgroundagainst-background(如果你需要词法作用域)来执行设置和拆解。

一般的想法类似于其他语言的设置/拆解,你可以这样做:

(require '[clojure.java.io :as io])

(background (before :facts (io/make-parents "parent/child/file")
            :after :facts (map io/delete-file (reverse (file-seq (io/file "parent")))

(facts "About something or other
  ...)

在您的事实之前,这将创建parentchild目录(不是文件 - 如果您还需要文件,可以添加spit或其他内容)。然后在你的事实之后:

  • 以递归方式获取parent目录的内容列表(使用file-seq
  • reverse它(因为我们只能删除空的东西,所以必须从目录树的底部开始)
  • delete-file函数应用于树中的每个目录

创建和删除文件的代码可能不是最好的(我是新手!),但在Midje测试中设置和拆除内容的方法是合理的。

注意事项:

  • 使用此方法时,请小心树中的符号链接,否则可能会陷入循环中。
  • 使用:after语法而不是使用(after)宏来确保即使测试引发异常也会发生拆除。
  • 您可以在单个命名空间中的事实子集之后进行设置/拆分,方法是将它们包裹在(against-background)中,然后执行相同的操作。

参考文献:

https://github.com/marick/Midje/wiki/Setup,-Teardown,-and-State https://github.com/marick/Midje/wiki/Background-prerequisites