【问题标题】:How can I prevent symbol contamination between Clojure tests?如何防止 Clojure 测试之间的符号污染?
【发布时间】:2014-05-30 15:17:30
【问题描述】:

我使用模拟式测试来确保我的整个应用程序正常工作。核心 Clojure 测试库用于测试,通过 Leiningen 执行。当-main 函数运行时,它定义符号供以后在其逻辑中使用。问题是,如果我不小心使用了在一个-main 测试中创建但从未在当前-main 测试中定义的符号,它仍然有一个值。我希望得到一个符号未定义的错误,但似乎我的测试环境在deftest 执行之间以某种方式共享状态。我该如何处理?将所有方便驱动的符号定义移至let 语句?

【问题讨论】:

    标签: unit-testing testing clojure tdd leiningen


    【解决方案1】:

    如果您在函数中使用def-ing 全局变量,这通常被认为是不好的做法,并且有足够的理由按照您的建议使用let

    但是,您可以捕获命名空间映射的快照。

    (def ns-snapshot (ns-map *ns*))
    

    这样在你实习符号之后

    (def foo 1)
    (def bar 2)
    

    您可以确定添加内容

    (reduce dissoc (ns-map *ns*) (keys ns-snapshot))
    ;=> {bar #'so.core/bar, foo #'so.core/foo}
    

    然后取消映射

    (doseq [[k v] (reduce dissoc (ns-map *ns*) (keys ns-snapshot))] (ns-unmap *ns* k))
    

    这样你就会再次得到想要的未定义错误

     foo ;=> CompilerException ... Unable to resolve symbol: foo in this context
    

    【讨论】:

    • 有关排除额外符号的优秀信息。所以我是def -ing 符号的原因之一也是,我将在定义每个符号之前和之后记录消息。我应该嵌套let 语句来让它工作吗?或者你能想出更好的方法吗?
    • @user1559027 也许发布一个新问题,其中包含您正在谈论的代码示例?从那个简短的描述中我不明白你在做什么。
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多