Как изменить свойства тестового объекта в KotlinTest через interceptTestCase

Я пытаюсь использовать метод interceptTestCase для настройки свойств для тестового примера в KotlinTest, как показано ниже:

class MyTest : ShouldSpec() {
    private val items = mutableListOf<String>()
    private var thing = 123

    override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
        items.add("foo")
        thing = 456
        println("Before test ${items.size} and ${thing}")
        test()
        println("After test ${items.size} and ${thing}")
    }

    init {
        should("not work like this") {
            println("During test ${items.size} and ${thing}")
        }
    }
}

Вывод, который я получаю:

До теста 1 и 456

Во время теста 0 и 123

После теста 1 и 456

Поэтому сделанные мной изменения не видны в тестовом примере. Как мне изменить свойство перед каждым выполнением теста?

1 ответ

Решение

Вы должны получить доступ к текущей спецификации через TestCaseContext, каждый тест имеет свои отдельные Spec, например:

override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
    //                v--- casting down to the special Spec here.
    with(context.spec as MyTest) {
    //^--- using with function to take the `receiver` in lambda body

        items.add("foo") // --
                         //   |<--- update the context.spec properties
        thing = 456      // --

        println("Before test ${items.size} and ${thing}")
        test()
        println("After test ${items.size} and ${thing}")
    }
}
Другие вопросы по тегам