0

使用clojure.spec ( org.clojure/clojurescript {:mvn/version "1.10.520"}),我有一个函数规范,它为其输入指定一个映射。

gen/generate并且gen/sample工作正常。cljs.spec.test.alpha/check但是使用应该是地图的输入调用错误,但传递了一个集合( Error: More than one element found in structure)。即,看起来规范系统正在生成错误的输入。

这是规范的错误吗?

酒吧规格

(s/def ::check-run
  (s/keys
    :req-un
    [::action
     ::check_run
     ::installation
     ::organization
     ::repository
     ::sender]))

foo.cljs

(s/def ::payload :bar/check-run)
(s/def ::check-run-started (s/keys :req-un [::payload]))

(s/fdef check-run->cijob-created
  :args (s/cat :arg ::check-run-started))

(defn check-run->cijob-created [arg])

虽然函数规范只声明了 A,但规范系统正在生成 B。

;; A
{:payload {:action "", :check_run {:html_url "", }}, ...}

;; B
[({:payload {:action "", :check_run {:html_url "", }}, ...}})]

工作台

(cljs.spec.test.alpha/check
  `foo/check-run->cijob-created
  {:clojure.spec.test.check/opts {:num-tests 10}})


[{:spec #object[cljs.spec.alpha.t_cljs$spec$alpha50916],

  :clojure.spec.test.check/ret
  {:shrunk
   {:total-nodes-visited 313, :depth 148, :pass? false, :result #object[Error Error: More than one element found in structure: 0], :result-data #:clojure.test.check.properties{:error #object[Error Error: More than one element found in structure: 0]}, :time-shrinking-ms 11299,
    :smallest
    [({:payload {:action "", :check_run {:html_url "", }}, ...}})]},

  :sym foo/check-run->cijob-created,
  :failure #object[Error Error: More than one element found in structure: 0]}]


  [1]: https://clojure.org/about/spec
4

1 回答 1

1

好的,想通了这一点。由于我使用了幽灵宏(带有导航器),它失败了。我不确定如何。但不知何故,这弄乱了 test.check 生成器。我假设这是某种奇怪的相互作用,在 Clojurescript 的宏系统中是行不通的。

无论如何,迁移到一个更简单get-in的解决了这个问题。

于 2021-04-19T03:29:29.330 回答