空手に含まれるJOSN配列のディープアサーション

Aug 19 2020
 Scenario: 
    Given def cat =
      """
      {
        name: 'Billie',
        kittens: [
          { id: 23, name: 'Bob', age: 35 },
          { id: 42, name: 'Wild', age: 25 }
        ]
      }
      """
    Then match cat.kittens contains [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]

例に見られるように、私は「年齢」について心配していません。'#ignore'を使用できることを理解しています。他に方法はありますか、無視しなければならないようなノードがたくさんある場合。

私はちょうど考えています、それはJSONオブジェクトと同じようにJSON配列で動作することができますか?指定されたノードのみをアサートします。

エラー:

assert.feature:24 - path: $.kittens[*], actual: [{"id":23,"name":"Bob","age":35},{"id":42,"name":"Wild","age":25}], expected: {id=42, name=Wild}, reason: actual value does not contain expected

編集:

空手で提案された何かを試しました-配列に値が含まれているかどうかを確認する方法は?しかし、それは私を助けませんでした。私はスキーマ検証を探していません。代わりに、すべてのオブジェクトが異なるキー値を持つ可能性がある機能検証を探しています。

以下は失敗します

  Scenario: 
    Given def cat =
      """
      {
        name: 'Billie',
        kittens: [
          { id: 23, name: 'Bob', age: 35 },
          { id: 42, name: 'Wild', age: 25 }
        ]
      }
      """
      * def expected = [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]
    Then match cat.kittens contains '#(^expected)'

これは問題なく動作しますが、これは私を助けていません。

  Scenario: 
    Given def cat =
      """
      {
        name: 'Billie',
        kittens: [
          { id: 23, name: 'Bob', age: 35 },
          { id: 42, name: 'Wild', age: 25 }
        ]
      }
      """
      * def expected = { id: 42, name: 'Wild' }
    Then match cat.kittens contains '#(^expected)'

現在、配列を個別に読み取り、ループでアサートしています。

回答

1 PeterThomas Aug 18 2020 at 22:16

単語を追加するだけdeepで0.9.6.RC4で機能します

Then match cat.kittens contains deep [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]

最初の質問を閉じたときにリンクされた回答が役に立たなかった理由がわかりません。多分私は理解していません、そして他の誰かがより良い答えを提供することができます。