3

我正在与:

  • 斯波克核心
  • 斯波克报告
  • 斯波克弹簧
  • Spring MVC 测试

我有以下代码:

def "findAll() Expected"(){

    given: "The URL being used is: /personas/xml/personas"

        url = PersonaUrlHelper.FINDALL;

    when: "When the URL is being calling with a GET"

        resultActions = mockMvc.perform(get(url)).andDo(print())

    then: "something..."

        resultActions.andExpect(status().isOk())
                     .andExpect(content().contentType(RequestMappingProducesJsonUtf8.PRODUCES_JSON_UTF_8))

}

两个观察:

:观察given: "The URL being used is: /personas/xml/personas"手动添加 URL/URI 值的位置。

url变量怎么定义实例变量,因为它在很多测试方法中很常见。所以def String url

我的问题是:

如何在Spock标签/块url中显示变量?如何(给定,然后……)?它通过Spock Reports打印并改进我的测试文档

我已阅读以下内容: Spocklight:展开描述的额外数据变量

它在@Unroll周围工作。但我确实意识到围绕where标签/块的所有工作。

我已经尝试过类似的东西:

given: "The URL being used is: $url"
given: "The URL being used is: ${url}"

并且不工作

我想使用类似于以下的语法来解决:

def "findAll() Expected"(){

    url = PersonaUrlHelper.FINDALL;

    given: "The URL being used is: $url"

        …. something

    when: "When the URL is being calling with a GET"

那么什么是正确的配置呢?

假设我PersonaUrlHelper.FINDALL在一些 Spring@RequestMapping和这个测试方法中使用了重构。我不想手动更新given标签/块中的文本

那么正确的语法是什么?

4

1 回答 1

2

快速回答:

我想where-block 方法将是正确的方法。使用类似的东西

where: "When the URL is being calling with a GET"
  url << PersonaUrlHelper.FINDALL

url并从测试中删除定义。您将能够使用该url变量,因为它是在 -block 中定义的where。您将能够从测试描述中将其引用为#url

@Unroll
def "findAll() Expected"(){
    given: "The URL being used is: #url"
        //removed url definition
    when: "When the URL is being calling with a GET"
        resultActions = mockMvc.perform(get(url)).andDo(print())
    then: "something..."
        resultActions.andExpect(status().isOk())
                 .andExpect(content().contentType(RequestMappingProducesJsonUtf8.PRODUCES_JSON_UTF_8))
    where: "When the URL is being calling with a GET"
        url << [PersonaUrlHelper.FINDALL]
}

另一种更 hacky 的方法是url通过 a打印println url- 此输出也被捕获 afaik,但它不会那么好。

更新:请查看以下 spock 控制台脚本:https ://meetspock.appspot.com/script/5146767490285568:

import spock.lang.*

class PersonalUrlHelper {
  final static String FINDALL = 'http://example.com'
}

class MyFirstSpec extends Specification {
  @Unroll
  def "findAll() Expected #url "(){
    given:"The URL being used is: #url"        
    when: "When URL (#url) is assigned to a"        
      def a = url    
    then: "a equals the URL (#url)"        
      a == url
    where: "the URL is fetched from another class or map in this case"        
      url << [PersonalUrlHelper.FINDALL]
  }
}

我试图模拟你的脚本 - 没有你的代码。

如您所见,URL 的内容打印在测试名称中。AFAIK,当通过 spock-reports 打印出来时,它也会反映在不同测试块的文本中。

顺便说一句:[]它们很重要,因为它们将返回的字符串转换为一个包含一个元素的列表。否则字符串将被解释为 lsit 并且测试将遍历每个字符。

这有帮助吗?

于 2015-11-23T07:27:00.667 回答