clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
serioga 2019-02-13T20:15:42.004600Z

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

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

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

serioga 2019-02-13T20:16:23.005200Z

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

kuzmin_m 2019-02-13T20:20:03.008900Z

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

serioga 2019-02-13T20:23:41.009500Z

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

serioga 2019-02-13T20:24:35.010300Z

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

serioga 2019-02-13T20:25:33.011Z

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

kuzmin_m 2019-02-13T20:28:14.011500Z

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

serioga 2019-02-13T20:30:43.011600Z

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

serioga 2019-02-13T20:36:40.012400Z

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

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

kuzmin_m 2019-02-13T20:37:15.012900Z

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

kuzmin_m 2019-02-13T20:37:45.013600Z

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

serioga 2019-02-13T20:38:26.015300Z

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

kuzmin_m 2019-02-13T20:38:31.015500Z

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

kuzmin_m 2019-02-13T20:39:10.016300Z

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

serioga 2019-02-13T20:40:20.016700Z

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

serioga 2019-02-13T20:40:58.017400Z

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

serioga 2019-02-13T20:41:39.018400Z

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

kuzmin_m 2019-02-13T20:41:40.018500Z

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

kuzmin_m 2019-02-13T20:41:48.018700Z

Нет

kuzmin_m 2019-02-13T20:42:04.019200Z

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

serioga 2019-02-13T20:44:19.019600Z

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

serioga 2019-02-13T20:46:47.019700Z

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

kuzmin_m 2019-02-13T20:49:23.020300Z

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

kuzmin_m 2019-02-13T20:49:30.020600Z

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

kuzmin_m 2019-02-13T20:50:01.021200Z

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

serioga 2019-02-13T20:50:37.021700Z

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

kuzmin_m 2019-02-13T20:50:56.022Z

смотри

kuzmin_m 2019-02-13T20:50:59.022200Z

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

kuzmin_m 2019-02-13T20:51:21.022400Z

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

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

(declare ^:dynamic *id-generator*)

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

kuzmin_m 2019-02-13T20:51:40.022900Z

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

kuzmin_m 2019-02-13T20:52:20.023500Z

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

(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_m 2019-02-13T20:52:37.023900Z

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

kuzmin_m 2019-02-13T20:52:49.024300Z

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

kuzmin_m 2019-02-13T20:53:18.024800Z

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

(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_m 2019-02-13T20:53:41.025100Z

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

kuzmin_m 2019-02-13T20:54:44.026200Z

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

serioga 2019-02-13T20:55:19.026600Z

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

kuzmin_m 2019-02-13T20:55:26.026900Z

их тут нет

kuzmin_m 2019-02-13T20:55:43.027200Z

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

kuzmin_m 2019-02-13T20:55:53.027600Z

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

kuzmin_m 2019-02-13T20:56:47.028300Z

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

serioga 2019-02-13T20:57:53.028800Z

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

kuzmin_m 2019-02-13T20:58:05.029400Z

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

serioga 2019-02-13T20:58:15.029700Z

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

kuzmin_m 2019-02-13T20:58:24.029900Z

(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_m 2019-02-13T20:58:40.030400Z

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

kuzmin_m 2019-02-13T20:58:52.030700Z

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

serioga 2019-02-13T20:59:08.031100Z

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

kuzmin_m 2019-02-13T20:59:28.031600Z

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

kuzmin_m 2019-02-13T20:59:41.032Z

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

kuzmin_m 2019-02-13T20:59:55.032500Z

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

kuzmin_m 2019-02-13T21:00:45.033500Z

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

serioga 2019-02-13T21:03:29.034700Z

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

serioga 2019-02-13T21:03:58.035200Z

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

kuzmin_m 2019-02-13T21:04:02.035400Z

https://github.com/darkleaf/publicator/tree/3.0

serioga 2019-02-13T21:06:04.035800Z

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