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

欢迎!请参阅关于页面获取更多有关如何工作的信息。

0
Spec
给定这种情况,使用 fspec 会失败


(def uuid-regex #"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")

(s/def ::name string?)
(s/def ::age pos-int?)
(s/def ::id (s/and string? #(re-matches uuid-regex %)))
(s/def ::person (s/keys :req-un [::name ::age ::id]))

;; 正常工作 - ::id 泛型重写产生有效的 IDs
(s/exercise ::person 1 {::id (fn [] (gen/fmap str (gen/uuid)))})

;; 失败 - ::id 泛型重写未被使用
(s/exercise
  (s/fspec :args (s/cat :p ::person) :ret int?)
  10
  {::id #(gen/fmap str (gen/uuid))})
尝试了100次后无法满足这样的谓词。


**问题**:exercise 将生成一个验证参数并返回 gen int 函数的函数。当exercise 对生成的 fspec 函数进行规范时,它会调用 fspec-impl 上的 conform。fspec-impl 上的 conform* 调用 validate-function。validate-function 在生成的函数上运行 quick-check 但 conform* 和 validate-function 无法访问 exercise 中指定的生成器重写。如果你对使用 fspec 的任何内容运行 stest/check(例如具有 fspec 参数的 fdef),也会发生相同的问题。

1 个答案

0
参考:https://clojure.atlassian.net/browse/CLJ-2264 (由 alexmiller 报告)
...