Rx Java Наблюдаемый, не излучающий правильное состояние, выполняется один раз с начальным значением, переданным для свертывания - PullRequest
1 голос
/ 12 марта 2020
enum class CurrentState {
   SUCCESS,
   FAILURE
}

class ExecutorNode(
  private val execute: () -> Observable<CurrentState>
 ) : Node(emptyArray()) {
override fun getNodeState(): Observable<CurrentState> {
    return execute.invoke()
}
}

open class Node(
  private val children: Array<Node>
) {

open fun getNodeState(): Observable<CurrentState> {
    if (children.isEmpty()) {
        return Observable.just(CurrentState.FAILURE)
    }
    return children.fold(
        initial = Observable.just(CurrentState.FAILURE),
        operation = { observable: Observable<CurrentState>, node: Node ->
            observable.flatMap { nodeState ->
                if (nodeState == CurrentState.SUCCESS) {
                    Observable.just(nodeState)
                } else {
                    node.getNodeState()
                }
            }
        })
}
}

ИСПЫТАНИЯ ЕДИНИЦЫ НАЧИНАЮТСЯ ЗДЕСЬ

class NodeTest {
private lateinit var node: Node
val testSubscriber = TestObserver<CurrentState>()

@Before
fun setup() {
    val executorNode = ExecutorNode { StateReporter(CurrentState.FAILURE).getNodeState() }

    val children = Array(2) { executorNode }
    node = Node(children as Array<Node>)
}

@Test
fun getNodeState_FAILURE() {
    node.getNodeState().subscribe(testSubscriber)
    testSubscriber.assertValueCount(1)
    testSubscriber.assertValues(CurrentState.FAILURE)
 }
}

class StateReporter(private val nodeState: CurrentState)  {
  fun getNodeState(): Observable<CurrentState> {
    return Observable.just(nodeState).delay(500, TimeUnit.MILLISECONDS)
  }
}

Когда я отлаживаю свой код и проверяю getNodeState_FAILURE Я не получаю никаких утверждений во время отладки своего кода, я вижу только начальные Failure внутри fold выполняется, последующее состояние дочернего узла не возвращает никакого сбоя. На стороне, не являющейся свойством узла, это то, что он проходит, если любой из дочерних узлов имеет УСПЕХ, это как оператор ИЛИ. Может кто-нибудь, пожалуйста, подскажите мне, почему наблюдаемые не получают подписку. Нужно ли снова подписываться в предложении else (node.getNodeState()), чтобы дочерние узлы правильно проходили по дереву?

...