Comments (10)
No you don't. My bad, didn't see you had it enabled already.
from kotest.
The docs say that runTest
skips delays, but not that it executes eagerly.
from kotest.
A side note: as explained in this Slack conversation, actually why the test never finished was because I never canceled viewModelScope
and the while (true)
loop ran forever.
The solution is to inject backgroundScope
into MyViewModel()
for tests, to replace viewModelScope
. Also then there's no need to call Dispatchers.setMain()
.
from kotest.
can you try enabling coroutineTestScope
?
"never finishes".config(coroutineTestScope = true) {
// The dispatcher from coroutineContext executes the `while(true)` loop continuously and without waiting for the delay
// The test never finishes
Dispatchers.setMain(coroutineContext[CoroutineDispatcher]!!)
MyViewModel()
println("test 2 finished") // Never comes this far
}
from kotest.
Isn't it enough that it's enabled for the whole spec, do I need to additionally enable it for every test as well?
from kotest.
My suspicion is, Kotest uses UnconfinedTestDispatcher
under the hood, which executes coroutines eagerly.
Generally StandardTestDispatcher
is recommended by the coroutines team for testing.
from kotest.
We use the runTest function to launch the test. According to docs there it will execute eagerly and skip delays, which seems a bit undesired if we also want to provide access to the testCoroutineScheduler
(as documented here) to allow control of time etc...
Do you suggest we should launch the test body in a new coroutine using the StandardTestDispatcher
instead of using runTest
?
from kotest.
At least the migration guide suggests that runTest
uses StandardTestDispatcher
.
from kotest.
It does, but it also advances time until idle, which is never the case with your sample.. Try executing your test with runTest
directly and you should see the same issue
from kotest.
You're right, I could reproduce the same behavior using runTest
in JUnit. Turns out I didn't understand how runTest
works.
import org.junit.jupiter.api.Test
class MyViewModelTest {
val testScheduler = TestCoroutineScheduler()
val testDispatcher = StandardTestDispatcher(testScheduler)
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun `runs correctly`() = runTest {
Dispatchers.setMain(testDispatcher)
MyViewModel()
println("test 1; MyViewModel created")
[email protected](2000)
println("test 1; after advanceTimeBy")
}
@OptIn(ExperimentalStdlibApi::class, ExperimentalCoroutinesApi::class)
@Test
fun `never finishes`() = runTest {
Dispatchers.setMain(coroutineContext[CoroutineDispatcher]!!)
MyViewModel()
println("test 2 finished") // Never finishes
}
}
Thank you for your explanations!
from kotest.
Related Issues (20)
- e: Compilation failed: Cannot find eager initialisation annotation class /kotlin.native.EagerInitialization
- UnmodifiableSequencedSet not supported HOT 6
- Ability to run & debug a single test from the Results view in Intellij HOT 1
- add the ability to generate assertions off of actual instances HOT 3
- Kotest @AutoScan warning message references wrong property name to disable autoscan HOT 1
- Revert WithData to testContainer level HOT 4
- Comparison between empty Set and Iterable fails
- Consolidate the changelog
- Kotest Gradle plugin is missing in snapshot publications HOT 1
- Arb.float() stops generating NaNs if the range is not 'full'
- add wasmWasi build target HOT 1
- Performance Degradation in 5.9.0 compared to 5.8.1 HOT 6
- afterSpec but not beforeSpec is called when all tests are filtered out HOT 2
- Test case names in JUnit 5 xml reports are
- JunitXmlReporter doesn't generate stactraces in generated XML
- Kotest fails to run individual tests when bootstrapping a `beforeProject` extension that initializes log4j HOT 2
- java.lang.NoSuchMethodError: 'io.kotest.core.test.Description$Test io.kotest.core.test.TestCase.getDescription()' in kotest-extensions-koin HOT 2
- Address nullability issue with Arb.edgecase HOT 2
- Sharing Flow in couroutineTestScope hangs tests HOT 2
- 'withEnvironment' must be used within leaf HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kotest.