2017-02-10 48 views
0

我刚开始使用spock。我有一个功能。 java函数进行http调用。根据功能,http调用中使用的URI必须包含“loc”参数,并且它应该只有一次。Spock:检查URI中的查询参数计数

我在写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”参数,map会覆盖第二个参数的旧值。

是否有任何人知道,如何访问查询参数列表,列表中我要搜索与“禄”

感谢提前开始字符串的计数。

回答

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 
} 
+0

谢谢!我明白了。顺便提一下,URI api永远不允许重复的查询参数,如果我们试图放置相同的查询参数,它将采用最新的查询参数。 –