测试表格测试的先决条件;表格如何工作?

时间:2016-10-24 14:07:58

标签: testing clojure tabular midje

让我们说我正在尝试测试一个应该处理某些对象字段是否存在的api。

我们说我有这样的测试:

(def without-foo
   {:bar "17"})

(def base-request
   {:foo "12"
    :bar "17"})

(def without-bar
   {:foo "12"})

(def response
  {:foo  "12"
   :bar  "17"
   :name "Bob"})

(def response-without-bar
  {:foo  "12"
   :bar  ""
   :name "Bob"})

(def response-without-foo
  {:bar  "17"
   :foo  ""
   :name "Bob"})

(facts "blah"
  (against-background [(external-api-call anything) => {:name => "Bob"})
  (fact "base"
    (method-under-test base-request) => response)

  (fact "without-foo"
    (method-under-test without-foo) => response-without-foo)

  (fact "without-bar"
    (method-under-test without-bar) => response-without-bar))

这可以按照您的预期进行,并且测试通过。现在我试图使用表格来重构这个:

(def request
  {:foo "12"
   :bar "17"})

(def response
  {:foo  "12"
   :bar  "17"
   :name "Bob"})

(tabular
  (against-background [(external-api-call anything) => {:name "Bob"})]
  (fact 
    (method-under-test (merge request ?diff) => (merge response ?rdiff))
  ?diff          ?rdiff             ?description
  {:foo nil}     {:foo ""}          "without foo"
  {}             {}                 "base case"
  {:bar nil}     {bar ""}           "without bar")

结果是:

FAIL at (test.clj:123)
  Midje could not understand something you wrote:
    It looks like the table has no headings, or perhaps you
    tried to use a non-literal string for the doc-string?

最终我最终得到了:

(tabular
  (fact 
    (method-under-test (merge request ?diff) => (merge response ?rdiff) (provided(external-api-call anything) => {:name "Bob"}))
  ?diff          ?rdiff             ?description
  {:foo nil}     {:foo ""}          "without foo"
  {}             {}                 "base case"
  {:bar nil}     {bar ""}           "without bar")

哪个过去了。我的问题是。 tabular函数与facts函数有何不同,为什么其中一个函数接受against-background而另一个函数爆发?

1 个答案:

答案 0 :(得分:2)

如果要为所有基于表格的事实建立后台先决条件,则需要进行以下嵌套:

(against-background [...]
  (tabular
    (fact ...)
    ?... ?...))

例如:

(require '[midje.repl :refer :all])

(defn fn-a []
  (throw (RuntimeException. "Not implemented")))

(defn fn-b [k]
  (-> (fn-a) (get k)))

(against-background
  [(fn-a) => {:a 1 :b 2 :c 3}]
  (tabular
    (fact
      (fn-b ?k) => ?v)
    ?k ?v
    :a 1
    :b 3
    :c 3))

(check-facts)
;; => All checks (3) succeeded.

如果您希望每个表格案例都有后台先决条件,则需要将其嵌套如下:

(表   (反对背景[...]     (事实......))   ?......?......)

让表格在tabular级别之下,而不是嵌套在against-backgroundfact中非常重要。

例如:

(require '[midje.repl :refer :all])

(defn fn-a []
  (throw (RuntimeException. "Not implemented")))

(defn fn-b [k]
  (-> (fn-a) (get k)))

(tabular
  (against-background
    [(fn-a) => {?k ?v}]
    (fact
      (fn-b ?k) => ?v))
  ?k ?v
  :a 1
  :b 2
  :c 3)

(check-facts)
;; => All checks (3) succeeded.

在你的代码中,表格数据看起来没有正确定位(圆括号,括号和花括号没有正确平衡,所以不可能说出究竟是什么不正确)。