3

我受到启发购买这本书:构建进化架构清洁架构

其中一个概念是能够在代码中测试您的架构。特别是,我希望能够检查命名空间、层之间的依赖关系,并断言命名空间不会为另一层调用命名空间。

我所有的命名空间都在圆圈内:

我的架构

这个想法是“控制器”内的命名空间不能在“实体”内导入命名空间,而只能导入他下面的命名空间(用例)。我想在我的单元测试中检测到这一点。

所以这应该在我的单元测试中失败:

(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 使用了类似的东西,或者您对如何解决这个问题有一些建议?

4

1 回答 1

0

使用ns-refers怎么样:

(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")))))
于 2021-08-20T16:21:16.143 回答