2017-02-10 17 views
0

私はspockを使い始めました。私は1つの機能を持っています。ここで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」のカウント数を確認したい

nullにすべきではありません"クエリパラメータ。それはちょうど1回通過する必要があります。上記のようなマップを使って、 "loc"パラメータを2回渡すと、マップは古い値を2番目の値で上書きします。

は、いずれかのリストとしてクエリパラメータにアクセスする方法を、知っていて、リストに私が「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' } 

プリント:

答えて

1

おそらく例が最高のスタートになりますが、正確に指摘したよう

$ 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を置くことができないということです特定の名前のパラメータの数を数えることです。

上記では、内側のリストがキーと値のペアであるリストのリストを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は重複するクエリパラメータを許可しません。同じクエリパラメータを配置しようとすると、最新のクエリパラメータが使用されます。 –

関連する問題