unit-testing - 参数化 Spock 设置

标签 unit-testing testing spock

是否可以参数化 Spock 设置

我的意思是,假设我有一个想要测试其状态的对象。该对象可以有多个状态,但为了简化事情,假设有一个我特别感兴趣的状态,S1

有多种方法可以将对象获取到S1。我正在测试状态,因此无论对象如何到达 S1S1 的所有测试都将是相同的。测试用例之间唯一不同的是设置策略。

解决这个问题的一种方法是拥有一个基本测试用例(或使用 Spock 说法的“规范”)和仅提供不同设置策略的子类。

但是,考虑到 Spock 提供的良好的数据驱动测试功能,我想知道是否有某种方法可以参数化设置,这样我就不需要具体的子类规范。

实际上,我想说的是,这是一个规范,现在用这些不同的执行设置方式来运行它。

最佳答案

至少有一些代码作为示例总是很高兴,但是在这里。
尝试将您的话放入数据驱动的规范中:

class MyObjectSpec extends Specification {

    @Unroll
    def "Using setup strategy '#desc', instance of MyObject will reach state S1" {

        setup:
        def myObject = new MyObject()
        setupStrategy.call(myObject)

        expect:
        hasStateS1(myObject)

        where:
        setupStrategy           | desc
        { setupThisWay(it)    } | 'this way'
        { setupThatWay(it)    } | 'that way'
        { setupAnotherWay(it) } | 'another way'
    }

    void setupThisWay(MyObject myObject) {
        // mutate myObject
    }

    // setupThatWay, setupAnotherWay

    void hasStateS1(MyObject myObject) {
        assert myObject.hasStateS1()
    }
}

我们使用 Groovy 闭包(在数据表中内联定义)来调用帮助程序方法来改变新创建的对象。

在这种情况下,没有 when block ,因为您暗示您希望在 setup 中发生有趣的部分(这与 >given),而 expect 是一个 then,不需要 when

辅助方法的类型为void,并执行自己的断言,如建议的in the Spock documentation (事实上​​,使 then/expect 无操作,但 Spock 编译器始终强制执行它)。

数据驱动文档是here .

关于unit-testing - 参数化 Spock 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34552946/

相关文章:

python - 在 pytest.mark.parametrize 中使用 fixture

ruby-on-rails - POST 成员路由的 Rspec 测试失败

java - 从 .class 文件恢复已删除的 Spock 测试用例

asp.net - 通过 ExecuteResult 单元测试或运行时 ActionResult 字符串输出响应?

Angular 5 : Unit testing getters and setters

android - 如何在不连接设备或模拟器的情况下运行 Android 测试用例?

java - 非静态字段初始化

java - 将属性添加到属性占位符

c# - 大型团队如何使用数据库

testing - Spock MissingMethodException