如何测试返回嵌套映射的函数?

时间:2014-01-24 13:32:59

标签: unit-testing clojure

如果函数说,(get-user-details user-id)返回一个嵌套映射,如:

 {:first-name "John"
  :last-name "Doe"
  :age 24
  :address {:house-no "24/3" 
            :street "Peter Parker Street"
            :city "New York"
            :country "USA"}}

我该如何测试?

顺序与=运算符有关,我不希望某些额外键的顺序或存在与测试用例的传递有关。

此类案件的一般测试策略是什么?

2 个答案:

答案 0 :(得分:1)

你可以创建一个这样的函数:

(defn my-eq [expected actual]
  (let [actual-subset (select-keys actual (keys expected))]
    (= actual-subset expected)))

它根据预期哈希中的键从实际结果中选择键,然后比较它们。

修改

但是,我很少写这样的测试。相反,我更喜欢将每个事物分解为单独的测试,以便错误消息提供有意义的反馈:

(is (= "Donna" (:name actual)))
(is (= 23 (:age actual)))
(let [address (:address actual)]
  (is (= 90210 (:zip address))))

答案 1 :(得分:1)

在工作中我们使用一些相当大的嵌套地图,我们使用Prismatic's Schema library来测试结构并向其他人描述它们的结构。它可以很好地处理可选键之类的内容,并且定义很好地保持可读性。

以下是他们网站的样本:

(s/validate
  Data  
  {:a {:b 123
       :c "ABC"}})
;; Exception -- Value does not match schema:
;;  {:a {:b (not (instance? java.lang.String 123)),
;;       :c (not (integer? "ABC"))}, 
;;   :d missing-required-key}

在验证数据结构后,我倾向于使用get-inselect-keys来测试较大嵌套结构中的特定值。每个映射的逻辑块都有一个断言,因此当事情中断时错误是有意义的。