0

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

简化版是:

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

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

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. 
}

我有4个问题:

  1. 检查前 4 个订单的方法是否正确?take(4)在 scala.rx中找不到方法
  2. 如果assert失败,测试仍然通过,如何解决?
  3. 这是停止流的正确方法吗?
  4. 如果线程没有在此处休眠,则测试将通过case Some(order)从未运行的代码。有没有更好的等待方式?
4

1 回答 1

1

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

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

见:http ://www.scalatest.org/user_guide/async_testing

于 2018-03-02T17:58:49.663 回答