我应该如何在Spek中设置可变测试装置?

时间:2017-03-26 17:05:32

标签: testing kotlin fixtures

我试图绕过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世界,在每次测试之前绝对一切(棒状静力学)都被拆除并重建,所以这一切看起来都很陌生!

1 个答案:

答案 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)
        }
    }
}
相关问题