【问题标题】:How can I find out why giving the wrong spec doesn't cause a blowup in my tests?我如何找出为什么给出错误的规格不会导致我的测试崩溃?
【发布时间】:2016-12-22 11:43:53
【问题描述】:

我的系统的某些部分已经被很好地规范了,但是当我将其中一个谓词更改为明显错误的东西时,我注意到我的所有测试仍然通过并且我没有从我开始依赖的规范中得到通常的爆炸在。

我无法弄清楚为什么会发生这种情况,而且我当然无法从 lein new test 开始重现它。

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

【问题讨论】:

  • 在运行测试之前你会打电话给spec.test/instrument吗?
  • 是的,我想我应该明确说明这一点。

标签: testing clojure clojure.spec


【解决方案1】:

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

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

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

有时会让人绊倒的一件事是stest/instrument 只检查函数的:args 规范,而不是:ret:fn 规范(仅供stest/check 使用)。

【讨论】:

  • 您只会收到顶级规范的错误,而不是嵌套的。我遇到的问题是当我将::foo 更改为s/keys 规范的一部分时。
【解决方案2】:

这是一个最小的复制:

(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 的调用)。

【讨论】:

  • 当你说“模式”时,我假设你的意思是“规范”,特别是 my-specced-fn fdef。
  • 当您instrument 时,您的my-specced-fn var 被替换为一个新的var,该函数将验证您的fdef 的:args你仪器。除非您再次检测,否则对该规范的更改不会生效。
  • 是的,这一切都很有道理,我只是不知道需要重新评估对instrument 的调用。使用重新加载的工作流程,它大部分时间都在工作:)
猜你喜欢
  • 2014-08-23
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多