core.test 中的 Clojure core.async
Clojure core.async in core.test
我有一些 core.async 代码,其中包含两个通道和三个节点的管道:
一个生产者 - 将值放入 chan1 的函数 >!! (它不在 go-block 中,但函数是从 go-loop 内部调用的)
一个过滤器 - 另一个不在 go-block 中但在 go-loop 中调用的函数,它从 chan1 中提取项目(带有 !!)
一个消费者 - 一个普通循环,它使用
拉取 chan2 的 n 个值
当我 运行 将此代码作为一个简单程序时,它按预期工作。但是当我复制并粘贴它以在单元测试中工作时,它会冻结。
我的测试代码大致是
(deftest a-test
(testing "blah"
(is (= (let [c1 (chan)
c2 (chan)
gen (make-generator c1)
filt (make-filter c1 c2)
result (collector c2 10) ]
result)
[0 2 4 6 8 10 12 14 16 18 20]))
))
其中 generator
创建一个从零开始向上计数的整数序列,而 filter
测试均匀性。
据我所知,过滤器能够从 c1 中提取第一个值,但在等待第二个值时被阻塞。同时,生成器在等待将其下一个值推入 c1 时处于阻塞状态。
但是当我在一个简单的独立程序中 运行 代码时,这不会发生。
那么,单元测试框架是否有可能干扰或导致 core.async 提供的线程管理出现问题?是否可以像这样对异步代码进行单元测试?
我担心我没有 运行在任何类型的 go-block 或 go-loop 中设置收集器,所以大概它可能会阻塞主线程。但同样,我认为我最终必须将所有数据拉回主线程。如果不通过该机制,又如何?
虽然在 go
-blocks/go
-loops 中使用阻塞 IO 不是最佳解决方案,但 thread
宏可能更适合这里。它将在单独的线程上执行传递的主体,因此您可以在那里自由使用阻塞操作。
我有一些 core.async 代码,其中包含两个通道和三个节点的管道:
一个生产者 - 将值放入 chan1 的函数 >!! (它不在 go-block 中,但函数是从 go-loop 内部调用的)
一个过滤器 - 另一个不在 go-block 中但在 go-loop 中调用的函数,它从 chan1 中提取项目(带有 !!)
一个消费者 - 一个普通循环,它使用
拉取 chan2 的 n 个值
当我 运行 将此代码作为一个简单程序时,它按预期工作。但是当我复制并粘贴它以在单元测试中工作时,它会冻结。
我的测试代码大致是
(deftest a-test
(testing "blah"
(is (= (let [c1 (chan)
c2 (chan)
gen (make-generator c1)
filt (make-filter c1 c2)
result (collector c2 10) ]
result)
[0 2 4 6 8 10 12 14 16 18 20]))
))
其中 generator
创建一个从零开始向上计数的整数序列,而 filter
测试均匀性。
据我所知,过滤器能够从 c1 中提取第一个值,但在等待第二个值时被阻塞。同时,生成器在等待将其下一个值推入 c1 时处于阻塞状态。
但是当我在一个简单的独立程序中 运行 代码时,这不会发生。
那么,单元测试框架是否有可能干扰或导致 core.async 提供的线程管理出现问题?是否可以像这样对异步代码进行单元测试?
我担心我没有 运行在任何类型的 go-block 或 go-loop 中设置收集器,所以大概它可能会阻塞主线程。但同样,我认为我最终必须将所有数据拉回主线程。如果不通过该机制,又如何?
虽然在 go
-blocks/go
-loops 中使用阻塞 IO 不是最佳解决方案,但 thread
宏可能更适合这里。它将在单独的线程上执行传递的主体,因此您可以在那里自由使用阻塞操作。