【问题标题】:How to test `Var`s of `scala.rx` with scalatest?如何用scalatest测试`scala.rx`的`Var`s?
【发布时间】:2018-08-10 22:48:59
【问题描述】:

我有一个方法可以连接到 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 个订单的方法是否正确?在 scala.rx 中找不到 take(4) 方法
  2. 如果assert失败了,测试还是通过了,怎么解决?
  3. 这是停止流的正确方法吗?
  4. 如果线程没有在此处休眠,则测试将通过case Some(order) 中的代码永远不会运行。有没有更好的等待方式?

【问题讨论】:

    标签: scala reactive-programming scala.rx


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 2011-11-05
      • 2023-03-21
      • 2016-05-12
      • 2012-07-15
      • 2017-10-22
      • 1970-01-01
      • 2020-01-27
      • 2012-05-20
      相关资源
      最近更新 更多