首页 文章

core.test中的Clojure core.async

提问于
浏览
0

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

  • 生产环境 者 - 将值放入chan1的函数> !! (它不在go-block中,但是从go-loop内部调用该函数)

  • 一个过滤器 - 另一个不在go-block中而是在go-loop中调用的函数,它从chan1中抽取项目(带有<!!),进行测试,如果测试通过将它们推到chan2上(用>! !)

  • 一个消费者 - 一个普通的循环,用于获取chan的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中运行收集器,所以可能它可能会阻塞主线程 . 但同样,我认为我必须最终将所有数据拉回主线程 . 如果不是通过那种机制,怎么样?

1 回答

  • 2

    虽然在 go -blocks / go -loops中使用阻塞IO不是最佳解决方案,但 thread 宏可能更适合此处 . 它将在单独的线程上执行传递的主体,因此您可以在那里自由地使用阻塞操作 .

相关问题