2017-02-10 26 views
0

Я только что начал с спока. У меня есть одна функциональность. где функция java делает http-вызов. В соответствии с функциональностью URI, используемый в HTTP-вызове, должен содержать параметр «loc», и он должен быть только один раз.Спок: проверьте количество параметров запроса в URI

Я пишу спот чехол. Я написал ниже фрагмент.

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 msgstr "параметр запроса. Его следует передавать ровно один раз. С картой, как указано выше, если дважды передать параметр «loc», карта переопределяет старое значение со вторым.

ли какой-либо один знает, как получить доступ к параметрам запроса в виде списка, а в списке я хочу, чтобы искать подсчет строк, которые начинаются с «LOC»

Спасибо заранее.

ответ

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 { } позволяет нам подсчитать вхождения некоторых элементов в список параметров.

Что касается вашего кода, нет необходимости звонить 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 никогда не позволяет дублировать параметры запроса, он берет последние параметры запроса, если мы попытаемся установить тот же параметр запроса. –