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

Я пишу тестовый модуль clojure.test для довольно большой функции в моем приложении. Эта функция делает несколько вызовов к базе данных и внешним службам 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 переопределяет только один метод за один раз.

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

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 если вы не знаете, у вас есть конкретная причина.

Другие вопросы по тегам