Spock:检查 URI 中的查询参数计数
Spock: check the query parameter count in URI
我刚开始使用 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" 参数,地图会用第二个参数覆盖旧值。
有谁知道如何以列表的形式访问查询参数,我想在列表中搜索以 "loc"
开头的字符串数
提前致谢。
也许一个例子是最好的开始:
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
正如您正确指出的那样,问题是如果您的目的是计算具有特定名称的参数的数量,则不能将参数放入地图中。
在上面,我们将参数解析为列表列表,其中内部列表是键值对。这样我们就可以调用 it.first()
来获取参数名称,并调用 it.last()
来获取参数值。 groovy List.count { }
方法让我们计算参数列表中某个项目的出现次数。
至于您的代码,无需在测试开始时调用 new URI()
,因为您无论如何都将值设置为几行。
此外,with(uri)
调用是不必要的,因为您不使用任何 uri 方法而不使用 uri.
作为前缀。 IE。你可以写:
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.
作为前缀,那么使用 with 就没有多大意义了。
生成的测试用例可能类似于:
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
}
我刚开始使用 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" 参数,地图会用第二个参数覆盖旧值。
有谁知道如何以列表的形式访问查询参数,我想在列表中搜索以 "loc"
开头的字符串数提前致谢。
也许一个例子是最好的开始:
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
正如您正确指出的那样,问题是如果您的目的是计算具有特定名称的参数的数量,则不能将参数放入地图中。
在上面,我们将参数解析为列表列表,其中内部列表是键值对。这样我们就可以调用 it.first()
来获取参数名称,并调用 it.last()
来获取参数值。 groovy List.count { }
方法让我们计算参数列表中某个项目的出现次数。
至于您的代码,无需在测试开始时调用 new URI()
,因为您无论如何都将值设置为几行。
此外,with(uri)
调用是不必要的,因为您不使用任何 uri 方法而不使用 uri.
作为前缀。 IE。你可以写:
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.
作为前缀,那么使用 with 就没有多大意义了。
生成的测试用例可能类似于:
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
}