【问题标题】:Clojure: how to enable spec asserts globally?Clojure:如何在全球范围内启用规范断言?
【发布时间】:2019-10-23 13:51:15
【问题描述】:

我想使用 clojure 规范来检查我的函数的输入(至少在开发期间)。到目前为止,我已经完成了以下工作:我已经定义了规范,并在函数的开头放置了如下示例中的断言:

(defn foo [bar]
  (s/assert ::bar bar)
  (do-something-with bar))

其中sclojure.spec.alpha 的别名。默认情况下,这些断言似乎被禁用(使用 midje 运行单元测试时)。我可以通过将(s/check-asserts true) 放入我的一个文件来启用它们。不过,我不确定这个设置的范围是什么。将它简单地放入源文件之一对我来说感觉不对,尽管到目前为止它似乎对我有用。

在测试期间全局启用这些断言但在部署应用程序时禁用它们的推荐方法是什么?

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    还有系统属性clojure.spec.check-asserts,您可以将其设置为true。这用于设置断言检查的初始值。 见https://clojure.org/guides/spec#_using_spec_for_validation

    【讨论】:

    • 如何设置这样的系统属性?我找不到任何好的信息。这和 Java 系统属性是一样的吗?
    • 是的,它与命令行上的标准 java -D 相同。
    • 我仍然不明白如何在使用 leiningen 运行测试时设置系统属性。 lein midje -Dclojure.spec.check-asserts=true 之类的命令似乎不起作用。
    • 如前所述,如果您为测试执行此操作,您可以考虑调用check-asserts 函数。例如,我们像这样检测所有指定的函数::profiles {:test { :injections [(require '[orchestra.spec.test :as stest]) (stest/instrument) (.println System/err "Instrumented specs")]}}
    • 我无法使用系统属性启用断言,但使用注入调用 check-asserts 有效::injections [(require '[clojure.spec.alpha :as s]) (s/check-asserts true)]
    【解决方案2】:

    调用此函数是全局启用规范的正确方法。如果您希望对所有测试全局启用它,我会将它放在所有测试所需的全局测试帮助程序文件的顶部。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 1970-01-01
      • 2021-09-07
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2016-07-03
      相关资源
      最近更新 更多