2

我已经开始使用 kotest:4.0.5 (kotlintest) 并且遇到了stringSpec嵌套在 describe子句中的函数问题。

例子:

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) }

            }
        }
    }
}

If include(emailValidation())is outsidedescribe子句然后正确工作。

您知道如何在子句中嵌套规范/功能吗?

4

2 回答 2

2

您只能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。

于 2020-05-27T20:28:48.243 回答
0

对于嵌套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" { }
}

注意Scope传递给扩展函数 for containerTemplateandtestCaseTemplate

输出:

Scenario: root container
   template container with FreeScope context
       nested template testcase with FreeScope context
于 2021-04-28T10:25:37.137 回答