0

我有一个将一些文本保存到文件的函数:

(defn save-keypair
  "saves keypair to ~/.ssb-clj/secret"
  [pair file-path]
  (let [public-key-string (->> (:public pair) (.array) (byte-array) (b64/encode) (bs/to-string))
        secret-key-string (->> (:secret pair) (.array) (byte-array) (b64/encode) (bs/to-string))]
    (spit file-path (str "Public Key: " public-key-string))
    (spit file-path (str "\nPrivate Key: " secret-key-string) :append true)))

它工作正常(目前通过打开文件并自己查看来检查)。但是,我想编写一个实际测试来检查一切是否正常。在 Clojure 中是否有一种惯用的方式来做到这一点?

4

2 回答 2

2

考虑使用with-redefs, 作为单元测试的一部分。在您的情况下,您可能希望将公钥和私钥的写入合并为一个我们可以用于测试的形式:

;; compute public-key-string and private-key-string as before
(let [contents (format "Public Key: %s\nPrivate Key: %s"
                        public-key-string secret-key-string)]
 (spit file-path contents)

测试可能是这样的:

(deftest saving-keypair
  (testing "Successful save"
    (let [file-mock (atom nil)]

      ;; During this test we redefine `spit` to save into the atom defined above
      (with-redefs [spit (fn [path data] (reset! file-mock {:path path :data data}))]

        ;; Perform IO action
        (save-keypair "~/.ssb-clj/secret" {:public "XXXX" :private "YYYYY"})

        ;; Test if the expected data was saved in the file-mock
        (is (= {:path "~/.ssb-clj/secret" :data "Public key: XXXYYYZZZ\nXXXYYYZZ"}
               @file-mock))
于 2019-09-09T00:21:09.780 回答
0

使用 Java 互操作File

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html

特别是,请参阅File.createTempFile()file.delete()file.deleteOnExit()。因此,您创建一个临时文件,在单元测试中使用它,读取您刚刚编写的文件并验证内容。然后使用自动删除作为备份显式删除文件(理想情况下在 try/finally 内)。

根据您在测试中设置预期结果的方式,您可能会发现以下内容很有用:

这些辅助函数对于文本文件输出特别有用,其中尾随newline字符的存在可能取决于操作系统。由于“换行符”是 CR、CR/LF 或 LF,它们也有助于忽略差异。

于 2019-09-08T21:33:29.663 回答