调用clojure.spec.test.alpha/check
时是否有方法为核心谓词函数覆盖生成器?
可以通过s/gen
中的路径来覆盖谓词生成器:
(gen/generate
(s/gen
(s/cat :s string?)
{[:s] #(gen/return "xyz")}))
但是test/check
不存在该选项:
(defn xyz [s] s)
(s/fdef xyz
:args (s/cat :s string?)
:ret string?)
;; throws
(test/check
`xyz
{:gen {[:args :s] #(gen/return "xyz")}})
必须提供名称或符号,但是对于string?
规范来说,名称是什么?我试过使用符号,都是'string?和`字符串?但它也不起作用。
通过在string?
中用s/with-gen
包装s/fdef
来覆盖生成器,导致生成器代码显示在函数的文档中……这会影响imo的可读性。
仅出于此目的定义新规范::string
并不正确。
答案 0 :(得分:0)
(ns so.spec
(:require [clojure.spec.gen.alpha :as gen]
[clojure.spec.alpha :as s]
[clojure.spec.test.alpha :as st]))
(defn xyz [s]
; only to make sure it gets called
(prn s)
s)
(s/def ::xyz-arguments (s/cat :s string?))
(s/fdef xyz
:args ::xyz-arguments
:ret string?)
(st/check
'so.spec/xyz
{:gen {::xyz-arguments #(gen/return '("xyz"))}})