如果函数说,(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"}}
我该如何测试?
顺序与=运算符有关,我不希望某些额外键的顺序或存在与测试用例的传递有关。
此类案件的一般测试策略是什么?
答案 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-in
和select-keys
来测试较大嵌套结构中的特定值。每个映射的逻辑块都有一个断言,因此当事情中断时错误是有意义的。