clojure-russia 2019-02-13

@kuzmin_m ты тут вопрос задавал про тесты, его в истории уже не видно я делаю как-то так:

(defn wrap-with-state [run]
  (mount/start)
  (run)
  (mount/stop))

(use-fixtures :once wrap-with-state)

если я правильно понял вопрос

Ты не так понял вопрос. Я хочу одинаковый набор тестов с разными фикстурами в разных неймспейсах. Сейчас я вроде как нащупал более-менее приличный вариант.

@kuzmin_m test-ns-hook не позволяет явно перечислить тесты из других неймспейсов?

(defn test-ns-hook []
  (common/test-rpc-server-id)
  (common/test-call-command)
  (common/test-broadcast))

я именно так не делал, но думается что должно работать

Оно с фикстурами не работает

а зачем ему работать с фикстурами? вызываешь фикстуры до и после тестов, они же здесь последовательно работают

@kuzmin_m т.е. вот так

(defn test-ns-hook []
  (init)
  (common/test-rpc-server-id)
  (common/test-call-command)
  (common/test-broadcast)
  (shutdown))

Каждый тест нужно обернуть в фикстуру

И фикстура разная для каждого неймспейса

так в моём примере (init) разный для каждого

Нужно каждый тест оборачивать, а не группу

ну хорошо, каждый но это же не проблема в test-ns-hook?

Условно Есть протокол Есть тесты на протокол Есть 2 реализации Нужно эти тесты применить к реализациям

примерного кода нет на «поиграть»? или вопрос не актуален уже?

то есть я пока вижу вопрос о передаче конкретной реализации в тесты

можно ли тест вернуть из функции, которой передали реализацию

Это через динамические переменные

Тест это var с метаданными

то есть test-ns-hook тебе тоже не подходит?

test-ns-hook не применяет фикстуры

это написано в документации

в общем, я на функциях и t/testing пробую это сделать

> test-ns-hook не применяет фикстуры но ты то их можешь применить вручную или нет?

смотри

есть протокол

(ns publicator.domain.abstractions.id-generator)

(defprotocol IdGenerator
  (-generate [this space]))

(declare ^:dynamic *id-generator*)

(defn generate [space]
  (-generate *id-generator* space))

его реализация задается через динамическую переменную

и есть набор тестов для этого протокола:

(ns publicator.domain.abstractions.id-generator-testing
  (:require
   [publicator.domain.abstractions.id-generator :as sut]
   [clojure.test :as t]))

(defn- return-value []
  (t/is (pos-int? (sut/generate :test-space))))

(defn tests [wrapper]
  (doseq [test [#'return-value]
          :let [test-name (-> test symbol name)
                test      (wrapper test)]]
    (t/testing test-name
      (test))))

тут только один “тест” - return-value

но может быть и много, для других протоколов

а сам тест выглядит вот так:

(ns publicator.domain.abstractions.id-generator-fake-test
  (:require
   [publicator.domain.abstractions.id-generator-fake :as sut]
   [publicator.domain.abstractions.id-generator-testing :as testing]
   [clojure.test :as t]))

(t/deftest id-generator
  (testing/tests (fn [t]
                   (fn []
                     (with-bindings (sut/binding-map)
                       (t))))))

@serioga понятнее стало?

т.е. это вроде как рабочее решение но может быть кто-то что-то другое придумал т.е. мне нужны обычные shared tests

а фикстурами здесь что выступает?

их тут нет

но их функция есть

(fn [t]
                   (fn []
                     (with-bindings (sut/binding-map)
                       (t)))))

т.е. я к тому, что clojure.test довольно убог его 10 лет назад написали и почти не трогали

не вижу откуда взялось sut/binding-map

я не давал этот листинг

> т.е. я к тому, что clojure.test довольно убог ну это известно kaocha

(ns publicator.domain.abstractions.id-generator-fake
  (:require
   [publicator.domain.abstractions.id-generator :as id-generator]))

(deftype IdGenerator [ids]
  id-generator/IdGenerator
  (-generate [_ space]
    (-> ids
        (swap! update space (fnil inc 0))
        (get space))))

(defn build []
  (IdGenerator. (atom {})))

(defn binding-map []
  {#'id-generator/*id-generator* (build)})

а kaocha чем поможет?

один фиг тесты объявляются через clojure.test

> а kaocha чем поможет? не знаю хвалят

может быть я еще на midje посмотрю

но он больно много зависимостей тянет

и с cider нет интеграции хотя вот нашел - https://github.com/nubank/midje-nrepl

но мне, по идее, не нужен синтаксис midje мне нужна возможность гибко объявлять тесты а не делать “красивые” метчеры

> понятнее стало? потрогаю на досуге, чтобы почуствовать проблему не умозрительно

если что получится альтернативное, отпишу

зачем ты тогда снипетами меня забрасывал 🙂