Fork me on GitHub
#clojure-russia
<
2019-02-13
>
serioga20:02:42

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

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

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

serioga20:02:23

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

kuzmin_m20:02:03

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

serioga20:02:41

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

serioga20:02:35

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

serioga20:02:33

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

kuzmin_m20:02:14

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

serioga20:02:43

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

serioga20:02:40

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

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

kuzmin_m20:02:15

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

kuzmin_m20:02:45

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

serioga20:02:26

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

kuzmin_m20:02:10

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

serioga20:02:20

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

kuzmin_m20:02:31

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

serioga20:02:47

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

serioga20:02:58

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

serioga20:02:39

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

kuzmin_m20:02:40

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

kuzmin_m20:02:04

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

serioga20:02:19

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

kuzmin_m20:02:23

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

kuzmin_m20:02:30

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

kuzmin_m20:02:01

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

serioga20:02:37

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

kuzmin_m20:02:56

смотри

kuzmin_m20:02:59

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

kuzmin_m20:02:21

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

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

(declare ^:dynamic *id-generator*)

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

kuzmin_m20:02:40

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

kuzmin_m20:02:20

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

(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))))

kuzmin_m20:02:37

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

kuzmin_m20:02:49

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

kuzmin_m20:02:18

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

(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))))))

kuzmin_m20:02:41

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

kuzmin_m20:02:44

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

serioga20:02:19

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

kuzmin_m20:02:26

их тут нет

kuzmin_m20:02:43

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

kuzmin_m20:02:53

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

kuzmin_m20:02:47

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

serioga20:02:53

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

kuzmin_m20:02:05

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

serioga20:02:15

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

kuzmin_m20:02:24

(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)})

kuzmin_m20:02:40

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

kuzmin_m20:02:52

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

serioga20:02:08

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

kuzmin_m20:02:28

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

kuzmin_m20:02:41

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

kuzmin_m20:02:55

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

kuzmin_m21:02:45

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

serioga21:02:29

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

serioga21:02:58

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

serioga21:02:04

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