Как протестировать `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 вопроса:
- Это правильный способ проверить первые 4 заказа? здесь нет
take(4)
метод найден в scala.rx - Если
assert
не проходит, тест все равно проходит, как это исправить? - Это правильный способ остановить поток?
- Если поток не спит здесь, тест передаст код в
case Some(order)
никогда не бежит. Есть ли лучший способ подождать?
1 ответ
Один из подходов, которые вы могли бы рассмотреть, чтобы получить List из Var, - это использовать .fold
комбинатор.
Другая проблема, с которой вы сталкиваетесь, связана с асинхронной природой данных. Предполагая, что вы действительно хотите поговорить с этой системой внешнего мира в своем тестовом коде (т. Е. Это ближе к аспектам тестирования интеграции), вы собираетесь Вы хотите взглянуть на поддержку Scatatest для асинхронных тестов и, вероятно, сделаете что-то вроде построения будущего из обещания, которое вы можете выполнить, когда накопите 4 элемента в своем списке.