如何用scalatest测试`sc的`scala.rx`?

时间:2018-03-02 17:02:45

标签: scala reactive-programming scala.rx

我有一个方法连接到websocket并从一些真正的外部系统获取流消息。

简化版本是:

ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type 

当我测试它(使用scalatest)时,我想让它连接到真正的外部系统,并且只检查前4个命令:

def watchOrders(): Var[Option[Order]] = {
  val value = Var[Option[Order]](None)
  // onMessage( order => value.update(Some(order))
  value
}

我有4个问题:

  1. 检查前4个订单是否正确? scala.rx
  2. 中找不到test("watchOrders") { var result = List.empty[Order] val stream = client.watchOrders() stream.foreach { case Some(order) => result = depth :: result if (result.size == 4) { // 1. assert(orders should ...) // 2. stream.kill() // 3. } case _ => } Thread.sleep(10000) // 4. } 方法
  3. 如果take(4)失败,测试仍然通过,如何解决?
  4. 这是停止流的正确方法吗?
  5. 如果线程没有在这里睡觉,测试将传递assert中从未运行的代码。还有更好的等待方式吗?

1 个答案:

答案 0 :(得分:1)

您可以考虑从Var中获取List的一种方法是使用.fold组合器。

您遇到的另一个问题是处理数据的异步性质 - 假设您真的想在测试代码中与外部真实世界系统进行对话(即,这更接近集成测试方面),他们希望看看scalatest对异步测试的支持,并且可能会做一些事情,例如在你积累列表中的4个元素时可以完成的承诺构建未来。

请参阅:http://www.scalatest.org/user_guide/async_testing