Giter VIP home page Giter VIP logo

Comments (10)

Kantis avatar Kantis commented on May 28, 2024 1

No you don't. My bad, didn't see you had it enabled already.

from kotest.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024 1

The docs say that runTest skips delays, but not that it executes eagerly.

from kotest.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024 1

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.

Kantis avatar Kantis commented on May 28, 2024

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.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024

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.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024

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.

Kantis avatar Kantis commented on May 28, 2024

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.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024

At least the migration guide suggests that runTest uses StandardTestDispatcher.

from kotest.

Kantis avatar Kantis commented on May 28, 2024

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.

lukaszkalnik avatar lukaszkalnik commented on May 28, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.