【问题标题】:spock unit test loops in then clausethen 子句中的 spock 单元测试循环
【发布时间】:2013-02-19 21:44:46
【问题描述】:

我在 then 子句中有一个循环测试:

result.each {
  it.name.contains("foo")
  it.entity.subEntity == "bar"
}

for (String obj : result2) {
  obj.name.contains("foo")
  obj.entity.subEntity == "bar"
}

最近我意识到循环没有经过真正的测试。无论我是否有 foo 或 bar 或其他任何东西,测试始终是绿色的 :) 我发现,必须以不同方式测试循环,例如与“每一个”?但只是将 'each' 更改为 'every' 会引发异常:

result.every {
  it.name.contains("foo")
  it.entity.subEntity == "bar"
}

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Spec expression: 1: expecting '}', found '==' @ line 1, column 61.
   s("foo") it.entity.rootEntity == "bar" }

我应该如何在测试中正确使用循环?我正在使用 spock 0.7-groovy-2.0

【问题讨论】:

    标签: testing loops spock clause


    【解决方案1】:

    要么使用显式断言语句:

    result.each {
        assert it.name.contains("foo")
        assert it.entity.subEntity == "bar"
    }
    

    every 中的单个布尔表达式:

    result.every {
        it.name.contains("foo") && it.entity.subEntity == "bar"
    }
    

    【讨论】:

    • 警告!第一种方法将生成更易读的失败消息,但如果result 为空集合,则会评估为false(并且操作失败)!
    • 附加警告:如果您传递给every 的闭包是多行,则第二种方法可能会遇到presently unresolved bug
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2016-06-17
    相关资源
    最近更新 更多