2017-02-09 1 views
0

私は安心して経験が限られています。私は通常、その中で例を見つけることができますか、またはGoogleで失敗するいくつかのテストがありますが、匿名配列内の要素のネストされたプロパティに一致させようとしていて、 。REST Assured:JSONでネストされたプロパティを使用して要素を検索し、他のプロパティを検証する方法

例JSON:

[ 
    { 
     "id":1, 
     "type":{ 
     "typeId":3, 
     "name":"LPM" 
     }, 
     "status":{ 
     "id":1, 
     "price":1.20, 
     "source":172, 
     "valid":0 
     } 
    }, 
    { 
     "id":2, 
     "type":{ 
     "typeId":2, 
     "name":"ST" 
     }, 
     "status":{ 
     "id":10, 
     "price":1.20, 
     "source":172, 
     "valid":0 
     } 
    } 
] 

私は残りの部分保証を使用している、と私はLPMに等しいtype.nameを持って、リスト内の要素を見つけたい、そしてstatus.priceを検証し、status.source、とだけのstatus.idこと素子。

私が最初に応答を検証し始めたとき、それが配列であることを一つの項目に対してのみ可能ではなかったので、私が使用していた。があるかもしれないしかし、これは、もはや仕事に保証され

response.then() 
     .assertThat() 
     .body("size", greaterThan(0)) 
     .body("[0].type.name", equalToIgnoringCase("LPM")) 
     .body("[0].status.id", equalTo(statusId)) 
     .body("[0].status.source", equalTo(sourceId)) 
     .body("[0].status.price", equalTo(price)); 

は、配列内に複数の要素があり、順序は保証されていません。

私はあることを私の体のチェックを変更した:

response.then() 
     .assertThat() 
     .body("size", greaterThan(0)) 
     .body("type.name", hasItem("LPM")) 
     .body("status.id", hasItem(statusId)) 
     .body("status.source", hasItem(sourceId)) 
     .body("status.price", hasItem(price)); 

これはテストに合格するために取得するのに十分であるが、これはtype.name LPMとstatus.idstatus.source、および要素のstatus.priceができることのリスクを紹介します間違っているかもしれませんが、type.name STの要素と照合されるため、これは検出されません。

だから私はすなわち、唯一その要素をチェックし、私はstatus.idstatus.source、およびstatus.price 1つだけ、その後があるように保証することができたのそれはtype.nameだとしてLPMを持っている要素を、見つけることができるようにしないでほしいです STエレメント。

type.nameが必要な要素を見つけるためにボディマッチャーを修正しようとしましたが、ツリーを上から下に戻す方法がわからないため、これを動作させることはできません

response.then() 
     .assertThat() 
     .body("size", greaterThan(0)) 
     .body("$.findAll (it.type.name = LPM}.status.id ", hasItem(statusId)) 
     .body("$.findAll (it.type.name = LPM}.status.source", hasItem(sourceId)) 
     .body("$.findAll (it.type.name = LPM}.status.price", hasItem(price)); 

この場合でも、本当に一度行うと3回ツリーが検索されます。

私の真ん中の試合はこのテストに合格していますが、私はこの権利を得たいと思います。私はListに要素を入れてそこから作業することができますが、他の例との一貫性のために、私は現在別のオプションを見ることはできませんが、むしろそうしたいと思います。

ドキュメントで何をしようとしているのかの例を見つけようとしましたが、実際には可能ではない可能性が常にあります。もしそうでなければ、私はそれの背後にある理論を教えてくれて嬉しいです。

助けてください。ここで

+0

あなたはこれを行うことだけを主張していますかwitj REST Assured? –

+0

@GrzegorzGórkiewiczはい、私は別のテストフレームワークを導入したくありません。私が望むようにできないなら、リストにjsonをデシリアライズし、それを反復処理します。 – Clarkey

+0

私は別の**テストの**フレームワークを意味しませんでした。私は、例えばGoogleのGSONを使ってJSONObjectsのリストをインスタンス化し、次にこのリストに希望のプロパティを持つ要素が含まれていることをHamcrestにアサートしたかったのです。 –

答えて

4

はそれを行うための一つの方法です:

... 
then(). 
     root("find {it.type.name == '%s'}.status"). 
     body("id", withArgs("LPM"), is(1)). 
     body("price", withArgs("LPM"), is(1.20f)). 
     body("source", withArgs("LPM"), is(172)). 
     body("id", withArgs("ST"), is(10)); 

(あなたは明らかに繰り返しを避けるためにも、変数にwithArgsを抽出することができます)。

findは、述語({it.type.name == '%s'})に一致する最初の要素を見つけるGroovyの方法で、findAllは常にリストを返します。

rootは、REST Assuredに次の期待値で使用される「ルートパス」を使用するように指示します(docs参照)。

+0

ありがとう!これは完全に機能しました。これは非常に洗練されたソリューションです。 JSONをデシリアライズして反復する必要があります。 – Clarkey

+0

また、私は明らかにいくつかのグルーヴィーを学ぶ必要があります! – Clarkey

関連する問題