我们希望在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中编写相同的测试。没有它将更困难。