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

欢迎!请参阅关于页面以了解更多关于这是如何运作的信息。

0
Spec
给定一个使用such-that失败的生成器,错误没有提供足够的信息来确定哪个规格或预测条件出现了问题


(require '[clojure.spec :as s])
(s/exercise (s/and string? #{"hi"}))
ExceptionInfo 在100次尝试后未能满足such-that预测条件。  clojure.core/ex-info (core.clj:4725)


这种情况的另一个特殊例子是提供了一个生成有效值的自定义生成器,但这个值不满足规格(Clojure内部添加了这个过滤器)


(require '[clojure.spec :as s])
(s/exercise (s/with-generator int? #(s/gen #{:a})))


*提议:* 在错误中说明哪个规格无法生成,并在可能的情况下说明整个规格路径。

(注意:原始描述已移至评论中)

6 个答案

0
_ 评论由:alexmiller_。

[原始描述来自工单:]

我创建了一个不符合规格的生成器(doh!)。生成器中包含了一个such-that预测条件。当我尝试从这个生成器中创建一个样本时,我得到了这个错误

ExceptionInfo 在100次尝试后未能满足such-that预测条件。  clojure.core/ex-info (core.clj:4725)

我以为这指的是我的自定义生成器,但实际上规格必须使用such-that来确保生成的值符合规格,而引起失败的正是这个such-that,而不是我在自定义生成器中的那个。

代码(已纠正问题但显示生成器中的such-that


(defn mod11-checkdigit
  "计算校验位,请参阅 http://freagra.com/imthealth/mitNNC.html"
  [n]
  (let [x (->> (map #(Integer/parseInt (str %)) (take 9 n))
                     (map * (range 10 1 -1))
                     (reduce +))
     y (mod x 11)
     c (- 11 y)]
     (cond (== 10 c) nil
               (== 11 c) 0
               :else c)))

(def nhs-number-gen
  "生成有效的NHS号码"
  (gen/fmap #(str (+ (* 10 %) (mod11-checkdigit (str %))))
             (gen/such-that #(mod11-checkdigit (str %))
                                (gen/choose 100000000 999999999))))

(defn nhs-number?)
  "如果传入的是有效的 nhs 号码则返回 true,否则返回 false"
  [n]
  (and (string? n) (= 10 (count n)) (= (str (mod11-checkdigit n)) (str (last n)))))

(s/def ::nhs-number (s/with-gen nhs-number?
                                                      (fn [] nhs-number-gen)))




如果没有错误抛出,生成的值符合规范,则会更美观。
0
by

评论者:alexmiller

据我所知,目前基于我们给 test.check 的是什么和返回的,这还不可能实现。

0
by

评论者:glittershark

看起来 test.check 正在更新以支持错误定制: https://github.com/clojure/test.check/commit/5aea0e275257680b672309b1e940be6dae92c17d . 我有一个补丁,可以更新 clojure.spec 来使用它,尽管显然它不起作用,因为链接的提交尚未进入 test.check 的发布版本。

0
by

评论者:glittershark

另请参阅 http://dev.clojure.org/jira/browse/TCHECK-107 我想

0
by

评论者:glittershark

附加补丁以供以后参考 (better-such-that-info.patch)。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-2025 (由 alex+import 报告)
...