Поведение `get` при переопределении метода с` with-redefs` - PullRequest
0 голосов
/ 28 февраля 2019

Я пишу несколько юнит-тестов, и для этого я пробую некоторые методы.Моя функция выглядит так:

(def my_map {:a 10 :b 20 :c 30})

(defn my-fn []
   (<= (get my_map :a) (get my_map :b)))

И я высмеиваю следующее:

(with-redefs [my_ns/my_map (fn [] {:a 100 :b 200 :c 300})]
  #(is (= true (my-fn))) ;; other asserts using the overridden function
 )

Я понял, что выражение (get my_map :a) выбрасывает NullPointerException при использованиииздевательский метод.Тем не менее, когда выполняется то же самое с использованием исходной реализации (без насмешек), все работает нормально.

Поэтому я понял, что если я перейду на (get (my_map) :a), то он отлично работает с ложными ссылками, но нарушает исходную реализацию.

Что мне здесь не хватает?Я ожидал, что with-redefs только отменяет реализацию определенного метода.

1 Ответ

0 голосов
/ 28 февраля 2019

Я не уверен, что полностью понимаю, чего вы пытаетесь достичь, но если вы имеете в виду называть my-fn в контексте модифицированного my_map, то вы можете попробовать

(with-redefs [my_map {:a 100 :b 200 :c 300}]
  (= true (my-fn)))

Это выражение временно изменяет my_map и затем запускает my-fn в этом новом временном контексте.Его значение будет результатом my-fn с измененным my_map.

. В качестве дополнительного примечания вы можете использовать более короткий (:a my_map) вместо (get my_map :a) (посмотрите, что являются ключевыми словами).Кроме того, поскольку my-fn возвращает логическое значение, вместо (= true (my-fn)) вы можете просто использовать (my-fn).

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