我怎样才能找出为什么给出错误的规范不会导致我的测试失败?

How can I find out why giving the wrong spec doesn't cause a blowup in my tests?

我的系统的某些部分的规格非常好,但是当我将其中一个谓词更改为明显错误的东西时,我注意到我的所有测试仍然通过并且我没有从规格中得到通常的爆炸我来了依靠。

我不明白为什么会这样,我当然无法从 lein new test 开始重现它。

有什么方法可以让 spec.test 在它找不到规范时给我一个警告,用于调试目的,而不是假设我不想规范我的这一部分系统?它能以其他方式帮助我调试这种情况吗?

如果您尝试使用未定义的规范,规范应该会出错。

目前无法让它告诉您未指定的内容。这样做需要检测(替换)所有变量并添加该检查。

对于您的特定问题,如果您有正在更改的规范,我会搜索谁在使用该谓词,然后尝试测试使用这些规范或原始谓词的每个事物。

有时让人感到困惑的一件事是 stest/instrument 只检查函数的 :args 规范,而不是 :ret:fn 规范(仅用于通过 stest/check).

这是一个最小的复制:

(ns test.core
  (:require [clojure.spec :as s]))

(defn my-specced-fn [x]
  x)

(s/fdef my-specced-fn
        :args (s/cat :arg int?))

(ns test.core-test
  (:require [clojure
             [test :refer :all]]
            [test.core :as core]
            [clojure.spec.test :as spec-test]))

(spec-test/instrument)

(deftest my-specced-fn-test
  (is (= 1 (core/my-specced-fn 1))))

这个测试初步通过。然后我会去编辑 test.core,更改架构并重新评估 test.core。在使用 string? 之类的谓词更改架构后,测试应该会失败,但它会一直通过。要解决问题,请重新评估测试命名空间(特别是对 instrument 的调用)。