Как организовать несколько блоков сопрограммы и ожидания в тесте Kotlin Spek?

Я написал неудачный тест Spek, потому что я сделал неправильное предположение о порядке выполнения, включающем несколько сопрограмм, и it функционирует:

 given("a test") { runBlocking { print("a") } it("block 1") { runBlocking { print("b") } } runBlocking { print("c") } it("block 2") { runBlocking { print("d") } } } 

Я ожидал, что abcd будет напечатан, но acbd самом деле напечатано.

Как мне написать этот тест, чтобы он как визуально читал, так и выполнял его в заданном порядке?

Spek в основном написан с использованием lambdas, поэтому для того, чтобы Spek знал о тестовом дереве, он должен выполнить его – это называется фазой обнаружения. В этом диапазоне областей фазы (заданный, описываемый, контекст) выполняются, в вашем случае вызывается runBlocking {print ("a")} и runBlocking {print ("c")} . Как только тестовое дерево известно, Spek теперь может перейти к этапу выполнения. На этом этапе Spek выполнит пройденные лямбды для проверки (action) и action (on) областей.

В качестве исправления вашей проблемы вы должны использовать область действия вместо данных .

 on("a test") { runBlocking { print("a") } it("block 1") { runBlocking { print("b") } } runBlocking { print("c") } it("block 2") { runBlocking { print("d") } } }