Kotest и kotlinx-сопрограммы-интеграция тестов

#kotlin-coroutines #kotlintest #kotest

Вопрос:

Я использую стиль тестирования Funspec в kotest, и я получаю сопрограмму, автоматически вводимую фреймворком, как показано ниже.

 class MyTestSpec: FunSpec() {
    init {
        test("test event loop") {
           mySuspendedFunction() // a coroutineScope is already injected by the test framework here     
        }
    }
}
 

Как я могу настроить платформу Kotest для использования экземпляра kotlinx.coroutines.test.TestCoroutineScope вместо a kotlinx.coroutines.CoroutineScope в моих тестах? или есть причина, по которой это не имело бы смысла?

Ответ №1:

Начиная с Kotest 5.0, существует встроенная поддержка TestCoroutineDispatcher . Смотрите здесь

Просто:

 class MyTest : FunSpec(
  {
    test("do your thing").config(testCoroutineDispatcher = true) { 
    }
  }
)
 

Ответ №2:

Создайте прослушиватель тестов, подобный этому:

 class MainCoroutineListener(
    val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()

) : TestListener {
    override suspend fun beforeSpec(spec: Spec) {
        Dispatchers.setMain(testDispatcher)
    }

    override suspend fun afterSpec(spec: Spec) {
        Dispatchers.resetMain()
        testDispatcher.cleanupTestCoroutines()
    }
}
 

Затем используйте его в своем тесте вот так

 class MyTest : FunSpec({
    listeners(MainCoroutineListener())
    tests...
})
 

Комментарии:

1. спасибо по какой причине диспетчер должен сбрасываться после каждой спецификации? не могу ли я оставить все как есть, так как я хочу, чтобы все тесты использовали TestCoroutineScope вместо обычного..

2. Прослушиватель будет запускаться перед каждой спецификацией, поэтому вам все равно нужно будет применить прослушиватель только один раз.