欢迎!请参阅关于页面获取更多关于这是如何工作的信息。
(is (not (<! ...))) 可用,但 (is (<! ...)) 不可用。
(is (not (<! ...)))
(is (<! ...))
在内部,is 会以这种方式重写代码,以调用 (apply <! ...),因为 is 假设 <! 是一个普通函数(见:在 clojure.test 中的 assert-expr :default(链接:1),assert-predicate(链接:2)),它触发了 ">! used" 在 (go ...) 块外的断言。断言
is
(apply <! ...)
assert-expr :default
assert-predicate
(链接: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 意识到特殊的 core.async 函数,并使用 assert-any 对这些。这是合理的,因为 core.async 是一个广泛使用的基础库。这将解决本问题中描述的特定问题。请求
assert-expr
assert-any
正确解决方案将是在 <! 和 >! 上创建宏而不是函数。
评论者:alexmiller
is 支持自定义表达式的 multimethod,因此我认为可以通过添加 <! 和 >! 上的 assert-expr 方法来解决此问题(可能在一个提供测试支持的核心异步命名空间中)。