Clojure - как внедрить другой протокол в реализацию - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в Clojure, и после его поиска я обратился к SO сообществу.

Я тестирую реализацию протокола (deftype), у которого есть ссылка на другой протокол, поэтомуКонструктор выглядит следующим образом:

(deftype FooImpl [^Protocol2 protocol-2]
    (function bar [_] ... (.bar2 protocol-2))
) 

... - это некоторые условия, которые слишком выполняются для вызова функции .bar2.

То, что я не могу сделать, этоПрибор (conjure.core/instrumenting) вызывает .bar2 для проверки переданного параметра (verify-called-once-with-args).

Итак, проблема в следующем:

(instrumenting [ns/function ;;In normal case with `defn`
                ????] ;; what to write for .bar2
   ....)

Спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

Для обычного использования или для тестирования / проверки вы можете использовать reify для реализации протокола:

(instrumenting [ns/function]
  (ns/function (reify Protocol2
                 (bar2 [_]
                   ; Your mock return value goes here
                   42))))

Вы также можете выполнить свою собственную проверку, используя atom:

(instrumenting [ns/function]
  (let [my-calls (atom 0)]
    (ns/function (reify Protocol2
                   (bar2 [_]
                     ; Increment the number of calls
                     (swap! my-calls inc)
                     ; Your mock return value goes here
                     42)))
    (is (= @my-calls 1))))

Выше предполагается, что вы используете clojure.test, но любой из библиотек модульного тестирования clojure может проверить значение вашего атома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...