core.test 中的 Clojure core.async

Clojure core.async in core.test

我有一些 core.async 代码,其中包含两个通道和三个节点的管道:

当我 运行 将此代码作为一个简单程序时,它按预期工作。但是当我复制并粘贴它以在单元测试中工作时,它会冻结。

我的测试代码大致是

(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 宏可能更适合这里。它将在单独的线程上执行传递的主体,因此您可以在那里自由使用阻塞操作。