2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅关于 页面,了解更多关于如何工作的信息。

0
测试

(is (not (<! ...))) 能够工作,但是 (is (<! ...)) 则不行。

在底层,is 以一种方式重写代码,使其调用 (apply <! ...),因为 is 假设 <! 是一个普通函数(参见:assert-expr :default(链接:1),assert-predicate(链接:2) 在 clojure.test)。它触发了 “>! 在 (go ...) 块外使用” 的断言。
断言。

(链接:1) -- https://github.com/clojure/clojure/blob/2e0c0a9a89ede8221504edeb90e8c4ee6cce7e16/src/clj/clojure/test.clj#L486
(链接:2) -- https://github.com/clojure/clojure/blob/2e0c0a9a89ede8221504edeb90e8c4ee6cce7e16/src/clj/clojure/test.clj#L435

示例代码:https://gist.github.com/augustl/4a679dc95847db4434d0e7348651224f#file-test-cljs-L34
宏展开:https://gist.github.com/amalloy/26ec8b8910c7c00bd7feaeef2307bc92#file-gistfile1-txt-L48

解决方案:使 assert-expr 能够识别特殊的核心异步函数,并使用
assert-any 为这些函数。由于核心异步是一个广泛使用的核心库,这是合理的。它会解决此问题中提到的特定问题。
问题。

正确的解决方案应是将 <! 和 >! 宏作为函数。

2 个回答

0

评论由:alexmiller 发布

is 支持自定义表达式的多重方法,因此我认为可以通过添加 assert-expr 方法在 <! 和 >! 上进行修补(可能在一个提供测试支持的核心异步命名空间中)。

0
...