2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以获得更多关于如何使用本服务的详细信息。

0
测试

给定以下代码

(deftest a-test
  (is false))

运行测试产生以下输出

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

行为是正确的。

由于以下几个原因,此错误消息非常令人困惑

  • 在这种情况下没有预期值。我并没有使用(is (= 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: 行其实是一个对 "我期望这个表达式返回真值" 的缩写,所以在你这个例子中它就是在说 "我期望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产生的真正漂亮的失败信息,因为我要从Expectations的报告引擎切换到clojure.test的报告引擎。曾与Alex Miller讨论过将来将clojure.test从Clojure“核心”中分离出来的可能性,以便它可以分开处理,并且表达了我接管其维护的意愿......我不知道这是否会发生,以及时间表会是怎样的。

+1 投票
by

您有没有更有用的一些例子,其中(is ...)测试表达式产生类似混淆的输出呢?

如果唯一的例子是(is false),那么Clojure的开发者似乎不太可能对clojure.test库做任何更改。

by
不,我遇到的就只有这一个情况。
...