SelfieExtension(projectConfig)
to your AbstractProjectConfig
-import com.diffplug.selfie.Selfie.expectSelfie
+import com.diffplug.selfie.coroutines.expectSelfie
And you're good to go!
Selfie has two artifacts which can run Kotest tests.
com.diffplug.selfie:selfie-runner-junit5
com.difplug.selfie:selfie-runner-kotest
You must choose only one, you'll get an error if both are on the classpath. You'll need to add the SelfieExtension
to your AbstractProjectConfig
like so:
import com.diffplug.selfie.junit5.SelfieExtension // selfie-runner-junit5
import com.diffplug.selfie.kotest.SelfieExtension // selfie-runner-kotest
import io.kotest.core.config.AbstractProjectConfig
class ProjectConfig : AbstractProjectConfig() {
override fun extensions() = listOf(SelfieExtension(this))
}
In a regular JUnit 5 test, you call Selfie.expectSelfie(...)
, like so
import com.diffplug.selfie.Selfie.expectSelfie
class TestClass {
@Test fun testMethod() {
expectSelfie(something).toMatchDisk()
}
}
Every Kotest test is a suspend fun
, not a regular fun
. You must use the functions in the coroutines
package instead of Selfie
.
import com.diffplug.selfie.coroutines.expectSelfie
class TestSpec : FunSpec({
test("testMethod") {
expectSelfie(something).toMatchDisk()
}
})
If you use Selfie
instead of coroutines
you'll get a runtime error reminding you to use the coroutines
function instead.
Inline literal toBe
snapshots don't need to know what test is currently running. But a toMatchDisk
snapshot needs to know which test is running so that it can put the correct name into the snapshot file.
For a JUnit test, selfie-runner-junit5
uses a ThreadLocal
to pass information about the currently running test. For a Kotest test using either runner, selfie-runner-junit5
or selfie-runner-kotest
, the information is stored in the coroutine context, which can only be accessed from a suspend fun
. This is why you must use coroutines.expectSelfie
instead of Selfie.expectSelfie
.
This issue only matters for disk snapshots. This creates a chance for confusion where you might be using inline literal toBe
snapshots without any problem. Then you try toMatchDisk
snapshots and get an error telling you to switch from Selfie.expectSelfie
to coroutines.expectSelfie
. This is expected, just make the switch and you'll be good to go.
Pull requests to improve the landing page and documentation are greatly appreciated, you can find the source code here.