请分享您的看法,在2024 Clojure现状调查!

欢迎!请查看关于页面以了解此如何工作的更多信息。

0 投票
特指
给定一个使用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-gen int? #(s/gen #{:a})))


*提案:* 在错误中指明哪个特指无法生成,如果可能的话还可能是整体特指中的路径。

(注:原始描述已移动到评论)

6 答案

0 投票
_评论由: alexmiller_ 提供

[原始描述从票据:]

我创建了一个不符合特指的生成器(see 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 1000000000 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 投票
已回答

评论者:alexmiller

基于我们对test.check提供的输入和返回值,我不确定这是否目前可行。

0 投票
已回答

评论者:glittershark

看起来test.check正在更新以支持错误定制:见此处。我已经获得一个补丁,它更新了clojure.spec以使用它,但显然它尚未在test.check的发行版本中实现。

0 投票
已回答

评论者:glittershark

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

0 投票
已回答

评论者:glittershark

附上补丁以供将来参考(《better-such-that-info.patch》)。

0 投票
已回答
参考: https://clojure.atlassian.net/browse/CLJ-2025 (由 alex+import 报告)
...