我开始使用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" { }
}
注意传递给扩展函数以进行containerTemplate
和testCaseTemplate
的Scope
输出:
Scenario: root container
template container with FreeScope context
nested template testcase with FreeScope context