В тесте clojure, как смоделировать несколько методов при тестировании одной функции?

Я пишу модульный тест clojure.test для довольно большой функции в моем приложении. Эта функция делает несколько вызовов db и внешних служб REST и выполняет некоторые вычисления. например, моя тестируемая функция выглядит так

(defn myfunc [id]
   (let[
        w (some-security-call id)
        x (some-db-call id)
        y  (some-REST-call x)
        z ( some-audit-call y)

       ]
       (-> y :somekey )))

в целях тестирования этого метода я хочу заглушить или переопределить "some-audit-call" и "some-security-call". Clojure with-redefs-fn переопределяет только один метод за раз.

Есть ли стандартный способ смоделировать несколько функций, используемых в тестируемой функции?


person user193116    schedule 02.09.2016    source источник


Ответы (1)


with-redefs работает с любым количеством функций. Вот отредактированный пример из моих реальных производственных тестов.

(with-redefs [namespace/redacted            (constantly [])
              namespace/redacted                 (fn [& args] (async/go namespace/redacted))
              namespace/redacted        (constantly [2 4])
              namespace/redacted                (fn [& args] (namespace/redacted sample-redacted-ads))
              namespace/redacted                (fn [_ _ redacted & _]
                                                  (async/go (cond-> namespace/redacted
                                                              namespace/redacted (dissoc redacted))))
              namespace/redacted                   (fn [& args] (async/go nil))
              namespace/redacted       fake-redacted
              namespace/redacted       fake-redacted
              namespace/redacted      namespace/redacted
              namespace/redacted       (go (constantly []))
              namespace/redacted               (fn [_] [])
              namespace/redacted      namespace/redacted
              namespace/redacted      namespace/redacted
              namespace/redacted                        (fn [_] {:redacted "redacted"})]
  (is (= "redacted"
         (get-in (<!!
                  )
                 ))
      "We should return the redacted if we don't pass it in")
  ... many more tests here ...

)

если вам нужно переопределить функцию, которая используется другой функцией, которую вы хотите переопределить, вам придется вложить вызовы with-redef. это иногда заставляет людей думать, что with-redefs работает только с одной функцией.

Скорее всего, вы не захотите использовать with-redefs-fn, если не знаете, что у вас есть конкретная причина.

person Arthur Ulfeldt    schedule 02.09.2016