Spock:检查URI

时间:2017-02-10 09:09:01

标签: groovy spock

我刚刚开始使用spock。我有一个功能。 java函数进行http调用的地方。根据功能,http调用中使用的URI必须包含" loc"参数,它应该只有一次。

我正在写Spock测试用例。我在下面写了一段摘录。

def "prepareURI" () {

    given: "Search Object"
        URI uri = new URI();
    when:
        uri = handler.prepareURI( properties) // it will return URI like http://example.com?query=abc&loc=US
    then:
        with(uri)
        {
            def map = uri.getQuery().split('&').inject([:]) {map, kv-> def (key, value) = kv.split('=').toList(); map[key] = value != null ? URLDecoder.decode(value) : null; map }

            assert map.loc != null
        }
}

从上面的片段中,我的2个测试通过了

  • 它应该存在
  • 不应该为空

我想查看" loc"的数量。查询参数。它应该只传递一次。如上图所示,如果我通过" loc"参数两次,map用第二个覆盖旧值。

有没有人知道,如何以列表的形式访问查询参数,在列表中我想搜索以" loc"

开头的字符串计数

提前致谢。

1 个答案:

答案 0 :(得分:1)

也许一个例子是最好的开始:

def uri    = new URI('http://example.com?query=abc&loc=US')
def parsed = uri.query.tokenize('&').collect { it.tokenize('=') }

println "parsed to list: $parsed"
println "count of 'loc' params:            " + parsed.count { it.first() == 'loc' }
println "count of 'bob' params:            " + parsed.count { it.first() == 'bob' }
println "count of params with value 'abc': " + parsed.count { it.last()  == 'abc' }

打印:

$ groovy test.groovy 
parsed to list: [[query, abc], [loc, US]]
count of 'loc' params:            1
count of 'bob' params:            0
count of params with value 'abc': 1

正如您所正确指出的那样,问题在于,如果您的目的是计算具有特定名称的参数的数量,则不能将您的参数放入地图中。

在上面,我们将params解析为列表,其中内部列表是键值对。这样我们可以调用it.first()来获取参数名称,并it.last()来获取参数值。 groovy List.count { }方法让我们可以计算params列表中某个项目的出现次数。

至于您的代码,您无需在测试开始时调用new URI(),因为您无论如何都要将值设置为几行。

此外,with(uri)电话是不必要的,因为您不使用任何uri方法,而无需使用uri.作为前缀。即你可以写:

def uri    = new URI('http://example.com?query=abc&loc=US')
def parsed = uri.query.tokenize('&').collect { it.tokenize('=') }

或:

def uri = new URI('http://example.com?query=abc&loc=US')
uri.with { 
  def parsed = query.tokenize('&').collect { it.tokenize('=') }
}

(请注意,我们在第二个示例中直接使用query

但是,如果您仍然使用uri.作为前缀,则使用时没有多大意义。

结果测试用例可能类似于:

def "prepareURI"() {
    given: "Search Object"
        def uri = handler.prepareURI( properties) // it will return URI like http://example.com?query=abc&loc=US

    when:
        def parsed = query.tokenize('&').collect { it.tokenize('=') }

    then:
        assert parsed.count { it.first() == 'loc' } == 1
}