Как смоделировать конкретную реализацию протокола, желательно с простым Clojure, т.е. без внешних библиотек, например Midje?Я знаю, как смоделировать все реализации, но не конкретные:
(defprotocol P
(foo [p]))
(defrecord R1 [])
(defrecord R2 [])
(extend-protocol P
R1
(foo [_] :r1)
R2
(foo [_] :r2))
(foo (->R1)) ;; :r1
(foo (->R2)) ;; :r2
;; now the mocking ...
(with-redefs [foo (constantly :redefed)]
(println (foo (->R1))) ;; :redefed
(println (foo (->R2)))) ;; :redefed
т.е. как заставить (foo (->R1))
вернуть :redefed
, в то время как (foo (->R2))
все еще возвращает :r2
?
Предположим, я могу вносить изменения только под комментарием now the mocking ...
.Обратите внимание, что я откладываю рекомендацию о расширении протокола, только если у меня есть контроль над протоколом, типом или обоими.