2016-10-24 4 views
1

Предположим, что я пытаюсь проверить 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

Вы должны иметь следующие вложенности, если вы хотите установить фоновые предпосылки для всех фактов на основе табличных:

(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. 

Если вы хотите иметь фоновую предпосылку за в каждом табличном случае вам необходимо вложить его в следующее положение:

(таблица (на фоне [...] (fa кар ...)) ? ...? ...)

Это важно иметь таблицу только под tabular уровнем, не вложенный в against-background или fact.

Например:

(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. 

В коде это выглядит как табличные данные не установлены правильно (круглые скобки, скобки и фигурные скобки не сбалансированы правильно, так что нельзя сказать, что именно неправильно).

+0

благодарит за ответ. Почему это? Какое чтение я должен делать, чтобы понять разницу между табличными и фактами? Я уверен, что вложенность не совсем ... –

+0

Я расширил свой ответ, чтобы рассмотреть другую возможность. –

Смежные вопросы