欢迎!有关如何工作的更多信息,请参阅 关于 页面。
(submap? m1 m2) 递归检查 m1 是否包含在 m2 中
(submap? m1 m2)
用法
(deftest submap (is (submap? {} {})) (is (not (submap? {:k 1} {}))) (is (submap? {:k 1} {:k 1 :j 2})) (is (submap? {:k {:kk 1}} {:k {:kk 1 :j 2}})) (is (not (submap? {:k {:kk 1}} {:j 2}))))
这种需求常出现在测试中,你想要检查经测试的函数返回的映射是否有某种形状,并且假定一个开放的世界,即你想忽略任何额外的键,这样修改函数测试就不会破坏测试。
;; BAD: doesn't assume open world (is (= {:k :v} (function-under-test))) ;; BAD: not expressive (is (= :v (:k (function-under-test)))) ;; BAD: not expressive, need to write :k twice (is (= {:k :v} (select-keys (function-under-test) [:k]))) ;; GOOD: expressive (is (submap? {:k :v} (function-under-test)))
许多代码库中已经存在实现(GitHub 代码搜索中有 400+ 次)。示例
https://github.com/clojure/tools.deps/blob/ecc80420c1b734b384f7a42df91684cdbc37ddc6/src/test/clojure/clojure/tools/deps/util.clj#LL12-L25C18
https://github.com/ptaoussanis/encore/blob/96547700c03a5e81d784bcc9253980d7355f2f2b/src/taoensso/encore.cljc#L2071
作为 https://clojure.atlassian.net/browse/CLJ-2755 登录