请在

欢迎!请参阅关于页面以了解更多关于此功能的信息。

0
测试

以下代码:

(deftest a-test
  (is false))

运行测试后,产生以下输出:

FAIL in (a-test) (form-init1218676551285641018.clj:28)
expected: false
  actual: false

行为是正确的。

此错误信息因几个原因而非常令人困惑

  • 在此情况下没有期望值。我没有使用(is (= expected actual))
  • 打印出的"expected"和"actual"是相同的值,但测试失败了。

2回答

+2

如果你使用一个产生false的变量或表达式,那么这里发生的事情会更加明显

user=> (def v false)
#'user/v
user=> (t/deftest foo (t/is v))
#'user/foo
user=> (foo)

FAIL in (foo) (NO_SOURCE_FILE:4)
expected: v
  actual: false
nil
user=> 

expected:行本质上是对"I expected this expression to yield truthy"的缩写,所以在你这个例子中,它是在说"我期望false会产生真值"(但实际值是false)。

clojure.test当然可以产生更好的输出——Jay Fields的Expectations库和Paul Stadig的clojure.test扩展Humane Test Output的大部分原始工作都是为了在断言失败时产生更好的错误信息。

当我从Expectations中提取出兼容clojure.test的工作并将其转换为一个独立的库https://github.com/clojure-expectations/clojure-test时,我失去了一些由于从Expectations的报表生成器切换到clojure.test的报表生成器而产生的真正出色的失败消息。我和Alex Miller讨论了将clojure.test在未来某个时间点从Clojure "核心"中分离开来以便单独工作的可能性,我表达了对承担其维护工作的兴趣……我不知道这会发生还是时间表会是什么。

+1
by

你有没有更实用的(is ...)测试表达式示例,能产生类似令人困惑的输出结果?

如果唯一的示例是(is false),那么似乎不大可能让 Clojure 开发人员更改 clojure.test 库。

by
不,我只遇到过这个唯一的情况。
...