【问题标题】:Spock & Spock Reports: How print a variable valuable in Label/BlockSpock 和 Spock 报告:如何在标签/块中打印变量变量
【发布时间】:2016-02-24 17:00:06
【问题描述】:

我正在与:

  • Spock 核心
  • Spock 报告
  • 斯波克弹簧
  • 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 报告 打印并改进我的测试文档

我已阅读以下内容: Spocklight: Extra Data Variables for Unroll Description

它围绕 @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"

那么正确的配置可能是什么?

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

那么正确的语法是什么?

【问题讨论】:

    标签: testing spock spock-reports


    【解决方案1】:

    快速回答:

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

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

    并从测试中删除url 的定义。您将能够使用url 变量,因为它是在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]
    }
    

    另一种更老套的方法是通过println url 打印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 并且测试将遍历每个字符。

    这有帮助吗?

    【讨论】:

    • 我已经测试了您的解决方案,但它不起作用。首先,我收到一条关于我无法在最新的then 之后声明when 的错误。并且变量始终为空。
    • 我刚刚修正了错字 - 最后一个块应该是 where。 - 对不起。我也会看看能不能抽出时间自己测试一下自己的答案,看看有没有其他问题……敬请期待……
    • 谢谢!。有两个问题(1)wherethen之后不能使用。 (2) 你的 url &lt;&lt; 总是失败,因为 NullPointer… 和相关的东西。
    • 请查看添加的详细信息。关于NullPointer - 我猜它是由您的FINDALL 辅助方法引起的。请确保它不返回 null - 它应该返回一个列表,或者,如果它返回单个项目,则将其放入 [] 括号中,就像我在我的示例中所做的那样。
    • 你好@rdmueller 你的代码现在可以工作了。继续在此处粘贴您的代码以应用您的答案有多正确。是的,诀窍是[]
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2018-08-24
    • 2020-03-04
    • 1970-01-01
    • 2021-05-02
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多