Kotest 在描述子句中嵌套规范



我开始使用kotest:4.0.5(kotlintest(,并且嵌套在describe子句中的stringSpec函数出现问题。

例:

class SellerTest : DescribeSpec({
describe("Registration") {
context("Not existing user") {
include(emailValidation()
}
}
})
fun emailValidation() = stringSpec {
"Email validation" {
forAll(
row("test.com"),
row("123123123123123")
) { email ->
assertSoftly {
val exception =
shouldThrow<ServiceException> { Email(email) }
}
}
}
}

如果include(emailValidation())在子句之外describe则正常工作。

你知道如何在子句中嵌套规范/函数吗?

您只能在顶层使用include。这是工厂测试(include 关键字的用途(实现方式的一部分(也许在将来的版本中会放宽(。

不过,您可以将整个东西移到工厂中。

class SellerTest : DescribeSpec({
include(emailValidation)
})
val emailValidation = describeSpec {
describe("Registration") {
context("Not existing user") {
forAll(
row("test.com"),
row("123123123123123")
) { email ->
assertSoftly {
val exception =
shouldThrow<ServiceException> { Email(email) }
}
}
}
}
}

您可以根据需要参数化命名,因为这只是字符串,例如:

fun emailValidation(name: String) = describeSpec {
describe("Registration") {
context("$name") {
}
}
}

如果不进行参数化,那么拥有测试工厂就没有多大意义。只需声明测试内联 IMO。

对于嵌套include,您可以实现自己的工厂方法,如以下示例所示:

class FactorySpec : FreeSpec() {
init {
"Scenario: root container" - {
containerTemplate()
}
}
}
/** Add [TestType.Container] by scope function extension */
suspend inline fun FreeScope.containerTemplate(): Unit {
"template container with FreeScope context" - {
testCaseTemplate()
}
}
/** Add [TestType.Test] by scope function extension */
suspend inline fun FreeScope.testCaseTemplate(): Unit {
"nested template testcase with FreeScope context" { }
}

注意传递给扩展函数以进行containerTemplatetestCaseTemplateScope

输出:

Scenario: root container
template container with FreeScope context
nested template testcase with FreeScope context

相关内容

  • 没有找到相关文章

最新更新