Clojure规范-谓词的覆盖检查生成器

时间:2019-03-31 00:59:01

标签: clojure clojure.spec test.check

调用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并不正确。

1 个答案:

答案 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"))}})