Ktor: тестирование конечных точек REST с использованием Spek/KotlinTest вместо JUnit Test Class

У меня есть простое приложение Hello World Ktor:

fun Application.testMe() {
  intercept(ApplicationCallPipeline.Call) {
    if (call.request.uri == "/")
      call.respondText("Hello")
    }
}

С тестовым классом JUnit я могу написать тест для него, как указано в его документации; следующим образом:

class ApplicationTest {
    @Test fun testRequest() = withTestApplication(Application::testMe) {
        with(handleRequest(HttpMethod.Get, "/")) {
            assertEquals(HttpStatusCode.OK, response.status())
            assertEquals("Hello", response.content)
        }
        with(handleRequest(HttpMethod.Get, "/index.html")) {
            assertFalse(requestHandled)
        }
    }
}

Однако я хочу провести юнит-тест в Spek или KotlinTest, без помощи JUnit, подобно тому, как я это делаю в ScalaTest/Play; более декларативным способом:

  1. Отправить FakeRequest на маршрут (т. Е. /) во время теста.
  2. Получить содержимое страницы и проверить строку "привет".

Вопрос в том, могу ли я написать описанный выше тест более декларативным способом в KotlinTest или Spek?

1 ответ

Решение

Прежде всего, следуйте инструкциям по настройке spek с JUnit 5

Тогда вы можете просто объявить вам спецификации, как показано ниже

object HelloApplicationSpec: Spek({
    given("an application") {
        val engine = TestApplicationEngine(createTestEnvironment())
        engine.start(wait = false) // for now we can't eliminate it
        engine.application.main() // our main module function

        with(engine) {
            on("index") {
                it("should return Hello World") {
                    handleRequest(HttpMethod.Get, "/").let { call ->
                        assertEquals("Hello, World!", call.response.content)
                    }
                }
                it("should return 404 on POST") {
                    handleRequest(HttpMethod.Post, "/", {
                        body = "HTTP post body"
                    }).let { call ->
                        assertFalse(call.requestHandled)
                    }
                }
            }
        }
    }
})

Вот мой build.gradle (упрощенный)

buildscript {
    dependencies {
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
    }

    repositories {
        jcenter()
    }
}

repositories {
    jcenter()
    maven { url "http://dl.bintray.com/jetbrains/spek" }
}

apply plugin: 'org.junit.platform.gradle.plugin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
}

dependencies {
    testCompile 'org.jetbrains.spek:spek-api:1.1.5'
    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
    testCompile "io.ktor:ktor-server-test-host:$ktor_version"
}
Другие вопросы по тегам