Как протестировать `Var`s из`scala.rx` с самым масштабным?

У меня есть метод, который подключается к веб-сокету и получает потоковые сообщения от какой-то действительно внешней системы.

Упрощенная версия:

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

Когда я тестирую его (с самым масштабным), я хочу подключить его к реальной внешней системе и проверять только первые 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) никогда не бежит. Есть ли лучший способ подождать?

1 ответ

Один из подходов, которые вы могли бы рассмотреть, чтобы получить List из Var, - это использовать .fold комбинатор.

Другая проблема, с которой вы сталкиваетесь, связана с асинхронной природой данных. Предполагая, что вы действительно хотите поговорить с этой системой внешнего мира в своем тестовом коде (т. Е. Это ближе к аспектам тестирования интеграции), вы собираетесь Вы хотите взглянуть на поддержку Scatatest для асинхронных тестов и, вероятно, сделаете что-то вроде построения будущего из обещания, которое вы можете выполнить, когда накопите 4 элемента в своем списке.

Смотрите: http://www.scalatest.org/user_guide/async_testing

Другие вопросы по тегам