Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 作为Groovy-Spock方法的经典单元测试_Unit Testing_Testing_Groovy_Junit_Spock - Fatal编程技术网

Unit testing 作为Groovy-Spock方法的经典单元测试

Unit testing 作为Groovy-Spock方法的经典单元测试,unit-testing,testing,groovy,junit,spock,Unit Testing,Testing,Groovy,Junit,Spock,我有一个Groovy Spock方法,它具有以下模式: def "My test"() { def a = createA(); assert a.fieldLevel1.isValid() def b = a.fieldLevel1 assert b.fieldLevel2.isValid() def c = b.fieldLevel2 assert c.fieldLevel3.isValid() ... } 正如您所看到的,由于断言和变量定义混合在一起,很难在块

我有一个Groovy Spock方法,它具有以下模式:

def "My test"() {
  def a = createA();
  assert a.fieldLevel1.isValid()
  def b = a.fieldLevel1
  assert b.fieldLevel2.isValid()
  def c = b.fieldLevel2
  assert c.fieldLevel3.isValid()
  ...
}
正如您所看到的,由于断言和变量定义混合在一起,很难在块上打破它。斯波克写这种测试的方法是什么

更新:


测试具有以下结构,因为c.fieldLevel3.isValid实际上是A的c.fieldLevel3实例,所以如果字段无效,我就不能继续进行。

单元测试的经典方法是保持测试的单一性。也就是说,每个测试测试一件事情,在本例中似乎不是这样

尽管如此,您可以在设置块中的所有设置代码之后,将expect块中的所有断言分组:

注意,通过使用Groovy的goodies访问isValid as valid并直接在辅助对象上调用该方法,我缩短了断言

此外,我没有使用通常的when/then Spock块,因为这个测试用例似乎与给定系统上的刺激/响应不太一致。但如果您愿意,也可以使用许多when和then交替块:

def "My test"() {
  when: def b = createA().fieldLevel1
  then: b.valid
  when: def c = b.fieldLevel2
  then: c.valid
  when: def d = c.fieldLevel3
  then: d.valid
}

单元测试的经典方法是保持测试的单一性。也就是说,每个测试测试一件事情,在本例中似乎不是这样

尽管如此,您可以在设置块中的所有设置代码之后,将expect块中的所有断言分组:

注意,通过使用Groovy的goodies访问isValid as valid并直接在辅助对象上调用该方法,我缩短了断言

此外,我没有使用通常的when/then Spock块,因为这个测试用例似乎与给定系统上的刺激/响应不太一致。但如果您愿意,也可以使用许多when和then交替块:

def "My test"() {
  when: def b = createA().fieldLevel1
  then: b.valid
  when: def c = b.fieldLevel2
  then: c.valid
  when: def d = c.fieldLevel3
  then: d.valid
}

不知道你为什么不接受上面的答案,看起来很好

作为一个小区别,您还可以执行以下操作:

def "My test of creating an A"() {
    when: 
        def a = createA()
    then: 
        a.fieldLevel1.isValid()
        a.fieldLevel1.fieldLevel2.isValid()
        a.fieldLevel1.fieldLevel2.fieldLevel3.isValid()
}
你是否“喜欢”这一点取决于你对德米特“定律”的遵循程度——Groovy似乎让这一点比过去更不相关


如果实际底层对象的复杂性使得这不是验证它们的有效方法,那么它们可能需要自己的单元测试。

不确定您为什么不接受上面的答案看起来很好

作为一个小区别,您还可以执行以下操作:

def "My test of creating an A"() {
    when: 
        def a = createA()
    then: 
        a.fieldLevel1.isValid()
        a.fieldLevel1.fieldLevel2.isValid()
        a.fieldLevel1.fieldLevel2.fieldLevel3.isValid()
}
你是否“喜欢”这一点取决于你对德米特“定律”的遵循程度——Groovy似乎让这一点比过去更不相关

如果实际底层对象的复杂性使得这不是验证它们的有效方法,那么它们可能需要自己的单元测试