【问题标题】:clojure.test (is (thrown? ...) not seeing exceptionclojure.test (is (throw? ...) 没有看到异常
【发布时间】:2014-07-02 08:58:53
【问题描述】:

我有一个函数 param-values,当它在 Liberator 上下文中找不到键时,它会抛出一个 IllegalArgumentException。我对此有一个 clojure.test 单元测试:

(testing "Non-existing key" 
  (is (thrown? IllegalArgumentException (param-values ctx [:baz]))))

由于某种原因,此测试失败,即使我可以看到我的函数在 REPL 中的行为正确:

user> (param-values ctx [:baz])
IllegalArgumentException Missing required param baz  resources/param-value (resources.clj:57)

user> (is (thrown? IllegalArgumentException (param-values ctx [:baz])))

FAIL in clojure.lang.PersistentList$EmptyList@1 (form-init2687593671136401208.clj:1)
expected: (thrown? IllegalArgumentException (param-values ctx [:baz]))
  actual: nil

param-values本身就很简单;它只是用param-value 映射到指定的参数:

(defn param-values [ctx args & [{:keys [optional-args] :as opts}]]
  (let [params (or (get-in ctx [:request :params]) {})
        args (concat args optional-args)]
    (map #(param-value params % opts) args)))

当然,我对param-value有更深入的测试,其中之一是:

(testing "Arg not present"
    (is (thrown-with-msg?
         IllegalArgumentException #"Missing required param baz"
         (param-value {} :baz))))

这个测试通过了!

什么给了?我正在做的事情与clojure.test/is 宏无关吗?是不是我的错字太粗了看不出来?

【问题讨论】:

    标签: unit-testing clojure


    【解决方案1】:

    是因为param-values返回了一个惰性序列吗?

    当使用thrown-with-msg? 时,它会在(param-value {} :baz) 的返回值上调用re-find,从而评估惰性序列。仅使用 thrown? 时不会发生这种情况。

    那么你可以试试这个吗:

    (is (thrown? IllegalArgumentException
          (doall (param-values ctx [:baz]))))
    

    doall 将评估惰性序列。


    基于 cmets 更新

    由于您对惰性序列的返回值不感兴趣,而只对副作用(抛出异常)感兴趣,因此最好使用dorun 而不是doall

    【讨论】:

    • 就是这样。谢谢一百万!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2020-12-20
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多