我们想在Clojure和ClojureScript之间运行相同的测试。然而,我们的一些CLJS测试是异步的,需要使用async宏。Clojure没有async宏,这使得测试的可移植性变得困难。如果我们添加async宏,至少有两条可能的途径:模仿cljs.test的async行为,或者复制实现。如果我们选择模仿行为,可以使用以下async宏。它创建一个承诺,运行主体,然后在承诺上阻塞,并在完成时传递承诺,允许测试继续。
(defmacro async
[done & body]
`(let [p# (promise)
~done #(deliver p# nil)]
~@body
(deref p#)))
这的优点是它集成了Clojure中当前运行的测试方式,并且不需要任何周边工具了解异步测试。
模仿实现将非常具有侵略性。这可能意味着将run-tests的行为更改为返回nil,就像ClojureScript所做的那样,以及许多其他修改。这意味着很可能是一个不可行的方案。
我强烈倾向于第一种方案。
要回答“为什么我们需要这个,它只是一个无操作?”的问题,这是有用的,这样我们就可以在Clojure和ClojureScript中编写相同的测试。如果没有它,这会变得更加复杂。