Midje, если не работает, как я ожидаю - PullRequest
1 голос
/ 11 ноября 2011

Я написал следующий тест Midje:

(fact (followers-minus-friends ...name...) => ["Dude"]
      (provided (idset show-followers ...name...) => #{1 2 3}
                (idset show-friends ...name...) => #{1 2}
                (userinfos #{3}) => [{:screen_name "Dude"}]))

для проверки следующей функции (в другом пространстве имен):

(defn followers-minus-friends [screenname]
  (let [difference-ids (difference (idset show-followers screenname)
                                   (idset show-friends screenname))
        userinfos (userinfos difference-ids)]
    (map :screen_name userinfos)))

Тест может показаться довольно бесполезным, но я просто пытаюсь привыкнуть к Мидже. Каким-то образом функция idset только что исполняется, что я хотел предотвратить, предоставив возвращаемое значение в предложенном условии. Что может быть объяснением этого?

РЕДАКТИРОВАТЬ : Я загрузил проект на Github здесь, на случай, если вы хотите попытаться воспроизвести описанную выше ситуацию: https://github.com/Borkdude/twitter-utils

1 Ответ

2 голосов
/ 27 ноября 2011

Проблема в том, что функция idset является закрытой в вашем пространстве имен источника.В тестовом файле вы интернируете его в тестовом пространстве имен.Теперь у вас есть два разных переменных, которые указывают на одну и ту же функцию:

 #'twitter-utils.core/idset
 #'twitter-utils.test.core/idset

В provided вы переопределяете второй переменный, чтобы указать на обязательную функцию.Однако функция followers-minus-friends по-прежнему относится к первому варианту.Это не переопределяется, поэтому вы получаете оригинальную функцию.

Распространенная идиома для маршрутизации вокруг объявлений private заключается в использовании полного имени переменной, как указано выше.Так что вы ожидаете, что это сработает:

(fact (followers-minus-friends ...name...) => ["Dude"]
      (provided (#'twitter-utils.core/idset show-followers ...name...) => #{1 2 3}
                (#'twitter-utils.core/idset show-friends ...name...) => #{1 2}
                (userinfos #{3}) => [{:screen_name "Dude"}]))

Хотя это не так.Я считаю, что ошибка в Midje.По крайней мере, я не могу сообразить, какой вред поддержит это.Я отправлю тикет.

В таком виде, вам нужно сделать idset публичным.

...