Проверка архитектуры вашего кода Clojure с помощью модульных тестов

Я был вдохновлен купить эту книгу: Построение эволюционных архитектур и чистой архитектуры.

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

Все мои пространства имен находятся внутри кругов:

моя архитектура

Идея состоит в том, что пространство имен внутри "контроллеров" не может импортировать пространство имен внутри "сущностей", а только импортировать пространства имен под ним (варианты использования). И я хотел бы обнаружить это в моих модульных тестах.

Так что это должно провалиться в моих модульных тестах:

(ns com.controller.core
  (:require [com.entities.core :as entities]
            [com.use-cases.core :as use-cases]))

(defn do-something [args]
      (let [use-cases-results (use-cases/do-something args)]
           (entities/do-some-other-thing use-cases-results)))

В Java вы можете написать подобные тесты, используя archunit.

private final JavaClasses classes = new ClassFileImporter().importPackagesOf(Controller/core.class);

noClasses().that().resideInAPackage("..controller..").should().accessClassesThat().resideInAPackage("..use-cases..").check(classes);

Используете ли вы что-то подобное для clojure или у вас есть предложения, как решить эту проблему?

1 ответ

Как насчет использования что ns-ссылки- то вроде:

      (deftest controllers-should-not-refer-to-entities
  (is (->> (all-ns)
           (filter #(clojure.string/includes? % "controller"))
           (map ns-refers)
           (map vals)
           flatten
           (not-any? #(clojure.string/includes? % "entities")))))
Другие вопросы по тегам