clojure.test(被抛出?...)没有看到异常

时间:2014-07-02 08:58:53

标签: unit-testing clojure

我有一个函数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宏的东西吗?我有一个错字,我看得太厚了吗?

1 个答案:

答案 0 :(得分:4)

是因为param-values返回一个懒惰的序列吗?

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

所以你可以试试这个:

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

doall将评估懒惰序列。


根据评论进行更新

由于您对延迟序列的返回值不感兴趣,但只对副作用(抛出异常)感兴趣,因此首选使用dorun代替doall。< / p>