Clojure测试中如何处理with-out-str输出末尾的换行符问题
解决方案
针对控制台输出末尾多余换行导致的测试不匹配问题,有两种更鲁棒的处理方案,优于直接硬编码拼接\newline:
方案1:修剪实际输出的末尾空白
如果业务逻辑不需要严格校验末尾换行的存在,可以仅修剪实际输出末尾的空白字符(换行、空格、制表符等),再与预期JSON对比。
使用Clojure标准库的clojure.string/trimr实现,不会修改字符串开头和中间的内容,兼容性更强:
(require '[clojure.string :as str]) (deftest create-account-test (testing "Create account" (is (= (cheshire/generate-string {:account {:active-card true :available-limit 100} :violations []}) ;; 仅修剪输出末尾的空白字符 (str/trimr (with-out-str (io/-main "test/sample-input.txt")))))))
方案2:符合POSIX规范的预期值构造
按照POSIX文本输出规范,行末尾默认需要携带换行符,如果你程序的输出带换行属于预期正确行为,可以通过捕获println输出的方式构造预期值,不需要硬编码换行符,跨平台兼容性更好(自动适配Windows\r\n、类Unix\n的换行差异):
(deftest create-account-test (testing "Create account" (is (= ;; 构造带标准换行的预期输出,无硬编码换行符 (with-out-str (println (cheshire/generate-string {:account {:active-card true :available-limit 100} :violations []}))) (with-out-str (io/-main "test/sample-input.txt"))))))
两种方案的选择依据:如果程序输出的换行是符合需求的标准行为,优先选方案2;如果不需要关心末尾换行的差异,仅校验JSON内容正确性,优先选方案1。
内容的提问来源于stack exchange,提问作者brenobarreto
相关产品推荐
相关产品推荐

