Clojure spec - генератор проверки переопределения для предиката - PullRequest
2 голосов
/ 31 марта 2019

Есть ли способ переопределить генератор для основной функции предиката при вызове 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? с s/with-gen внутри s/fdef приводит к отображению кода генератора внутри документации функции ..., что влияет на читабельность imo.

Определение новой спецификации ::string просто для этой цели не подходит.

1 Ответ

0 голосов
/ 31 марта 2019
(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"))}})
...