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