首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure.test (抛出?.)看不到例外

clojure.test (抛出?.)看不到例外
EN

Stack Overflow用户
提问于 2014-07-02 08:58:53
回答 1查看 359关注 0票数 1

我有一个函数param-values,它在解放者上下文中找不到密钥时抛出一个IllegalArgumentException。为此,我有一个clojure.test单元测试:

代码语言:javascript
复制
(testing "Non-existing key" 
  (is (thrown? IllegalArgumentException (param-values ctx [:baz]))))

由于某些原因,这个测试失败了,尽管我可以看到我的函数在REPL中正确运行:

代码语言:javascript
复制
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本身非常简单,它只是在指定的arg上使用param-value映射。

代码语言:javascript
复制
(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进行更深入的测试,其中之一是:

代码语言:javascript
复制
(testing "Arg not present"
    (is (thrown-with-msg?
         IllegalArgumentException #"Missing required param baz"
         (param-value {} :baz))))

这个测试通过了!

怎么回事?是关于我没有用clojure.test/is宏做的事情吗?我是不是有个太厚而看不见的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 09:34:46

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

当使用thrown-with-msg?时,它对(param-value {} :baz)的返回值调用re-find,从而计算延迟序列。如果只是使用thrown?,则不会发生这种情况。

你能试试这个吗?

代码语言:javascript
复制
(is (thrown? IllegalArgumentException
      (doall (param-values ctx [:baz]))))

doall将评估懒惰序列。

基于评论的更新

由于您对延迟序列的返回值不感兴趣,而只对副作用(抛出异常)感兴趣,所以倾向于使用dorun而不是doall

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24526917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档