我试图绕过Spek的灯具。 The Calculator example in the docs很容易理解,但是当一些灯具有状态时,我不确定如何构建设置/拆卸。例如,如果我正在测试列表:
describe("a list") {
val list = arrayListOf<Int>() // Only instantiated once
on("adding an item") {
list.add(123)
it("has a size of one") {
list.size.should.equal(1)
}
}
on("adding 2 items") {
list.add(1)
list.add(2)
it("has a size of 2") {
list.size.should.equal(2) // Fails, 3 != 2
}
}
}
根据我的理解,在Spek中,describe
块仅被评估一次,因此只有一个List实例。文档有用地建议使用测试夹具,但是无益无法给出示例!
我认为以下内容并不奏效,因为Kotlin并不了解Spek肯定会在beforeEachTest
之前致电on
describe("a list") {
var list : MutableList<Int>
beforeEachTest {
list = arrayListOf()
}
on("adding an item") {
list.add(123) // Compile error, list must be initialised
我可以通过使变量可以为空来解决这个问题,但是我必须在任何地方使用nullsafe运算符,这很糟糕,因为我知道它永远不会为null:
describe("a list") {
var list : MutableList<Int>? = null
beforeEachTest {
list = arrayListOf()
}
on("adding an item") {
list?.add(123) // Bleh
这也有效,但意味着现在需要在两个地方复制每一段设置代码
describe("a list") {
var list = arrayListOf<Int>()
beforeEachTest {
list = arrayListOf() // Bleh
}
on("adding an item") {
list.add(123)
打扰一下,如果这一点很明显,但是我来自JUnit世界,在每次测试之前绝对一切(棒状静力学)都被拆除并重建,所以这一切看起来都很陌生!
答案 0 :(得分:4)
如果您使用的是Kotlin 1.1
和Spek 1.1.0
,则可以使用memoized
。
describe("a list") {
val list by memoized { arrayListOf<Int>() }
on("adding an item") {
list.add(123)
it("has a size of one") {
list.size.should.equal(1)
}
}
on("adding 2 items") {
list.add(1)
list.add(2)
it("has a size of 2") {
list.size.should.equal(2)
}
}
}
每个on
都有list
的唯一实例。您可以将CachingMode
传递给memoized
来控制Spek如何缓存值。
CachingMode.TEST
(默认) - 每个测试都有一个唯一的实例(on
这里是一个特例并被视为test
)CachingMode.SCOPE
- 会有一个唯一的实例,实际上是一个单例。CachingMode.GROUP
- 每个group
都有一个唯一的实例。 memoized
仍可在Kotlin 1.1
之前使用,至少Spek 1.1.0-beta3
,但语法有点笨拙。
describe("a list") {
val list = memoized { arrayListOf<Int>() }
on("adding an item") {
list().add(123)
it("has a size of one") {
list().size.should.equal(1)
}
}
on("adding 2 items") {
list().add(1)
list().add(2)
it("has a size of 2") {
list().size.should.equal(2)
}
}
}