Модульное тестирование с собственной областью сопрограмм - PullRequest
2 голосов
/ 07 октября 2019

У меня есть класс, который выглядит примерно так:

class Foo {
  private val scope = Job() + Dispatchers.IO
  val emissions = PublishSubject.create<Bar>()

  fun doSomething() {
    scope.launch {
      // Do a whole bunch of work...
      withContext(Dispatchers.Main) emissions.onNext(bar)
    }
  }
}

И я пытаюсь найти способ его модульного тестирования. Я пытался сделать область видимости инъекционной и написать что-то вроде

@Test fun testFoo() = runBlockingTest {
  Dispatchers.setMain(TestCoroutineDispatcher())
  val foo = Foo(this)
  foo.doSomething()
  foo.emissions.assertStuff()
}

, но это не сработало. Утверждение происходит до того, как завершится сопрограмма внутри doSomething().

Я также пытался сделать этот диспетчер инъекционным, предоставляя Dispatchers.Unconfined, но это тоже не помогло. Что-то не так с этим подходом?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Тестирование асинхронного кода можно выполнить с помощью этой библиотеки: Ожидание ( или его расширение kotlin )

Вы могли бы написать что-то вроде:

@Test fun testFoo() {

  val foo = Foo()

  foo.doSomething()

  await().atMost(5, MILLIS).until(/* your check like - foo.emissions.onNext(bar) */);
}
0 голосов
/ 07 октября 2019

Если вы можете выставить задание для публичного API, вы можете попробовать

class Foo {
  private val scope: CoroutineScope = CoroutineScope(Job() + Dispatchers.IO)
  val emissions = PublishSubject.create<Bar>()

  fun doSomething() = scope.launch {
    // Do a whole bunch of work...
    withContext(Dispatchers.Main) { emissions.onNext(bar) }
  }
}

class Test {
  private val testFoo = Foo()
  private val testObserver: TestObserver<Bar> = TestObserver.create()

  @BeforeEach
  fun setUp() {
    testFoo.emissions.subscribe(testObserver)
  }

  @Test fun testFoo() {
    runBlockingTest {
      Dispatchers.setMain(TestCoroutineDispatcher())
      testFoo.doSomething().join()
      testObserver.assertValue(bar)
    }
  }
}
...