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