#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. Прослушиватель будет запускаться перед каждой спецификацией, поэтому вам все равно нужно будет применить прослушиватель только один раз.