Teilobjekte mit Tabellendaten abgleichen [Duplikat]

Nov 20 2020

Ich evaluiere derzeit Karate als Ersatz für unsere eigenen API-Tests. Ich habe einen Dienst, der Daten wie folgt zurückgibt:

{
  "items": [
    {
      "id": "1",
      "enabled": true,
      "foo": 1,
    },
    ...
  ],
  ...
}

Die Eigenschaften in jedem Element haben unterschiedliche Funktionen, und ich möchte sie separat testen.

Um beispielsweise die Aktivierung von Elementen zu testen, möchte ich überprüfen, ob die enabledEigenschaft den richtigen Wert für eine bestimmte Eigenschaft hat id.

Ich habe versucht, es so einzurichten.

Feature: Partial object matching
  Background:
    Given table items
    |id  |enabled|
    | '1'|true   |
    | '2'|true   |
    | '3'|false  |

  Scenario: match with all properties specified -- this passes
    * def response = { items: [ { id: '3', enabled: false }, { id: '1', enabled: true }, { id: '2', enabled: true } ] }
    * match $response.items contains only items Scenario: match with partial properties -- how can I make this pass (while also testing for something sensible)? * def response = { items: [ { id: '3', enabled: false, foo: 1 }, { id: '1', enabled: true, foo: 1 }, { id: '2', enabled: true, foo: 1 } ] } * match $response.items contains only items

Die realen itemObjekte sind ziemlich klobig und enthalten viel mehr Eigenschaften und verschachtelte Objekte. Ich würde lieber nicht die vollständige erwartete Struktur angeben, da sie sich auf viele verschiedene Merkmale beziehen und einige Eigenschaften dynamischer Natur sind.

Gibt es eine elegante matchMöglichkeit, dies zu tun, oder muss ich auf Skripte zurückgreifen?

Antworten

2 HenrikGustafsson Nov 20 2020 at 16:12

Dies scheint das Richtige zu tun;

Feature: Partial object matching
  Background:
    Given def filterTableKeys = read('filterTableKeys.js')
    Given table items
    |id  |enabled|
    | '1'|true   |
    | '2'|true   |
    | '3'|false  |

  Scenario: match with all attributes
    * def response = { items: [ { id: '3', enabled: false }, { id: '1', enabled: true }, { id: '2', enabled: true } ] }
    * match $response.items contains only items Scenario: match with partial attributes * def response = { items: [ { id: '3', enabled: false, foo: 1 }, { id: '1', enabled: true, foo: 1 }, { id: '2', enabled: true, foo: 1 } ] } * def responseItems = $response.items
    * def responseItems2 = filterTableKeys(responseItems, items)
    * match responseItems2 contains only items

wo filterTableKeys.jsist definiert als

function fn(items, table) {
    var mapper = function(v) { return karate.filterKeys(v, table[0]) }
    return karate.map(items, mapper)
}

Es fühlt sich jedoch nicht sehr elegant an, daher wären alle Hinweise, wie es deklarativer / weniger zwingend / "scripty" gemacht werden könnte, willkommen.


Bearbeiten

Wie Babu Sekaran weiter unten bemerkte, scheint dies gut zu funktionieren

  Scenario: match with partial attributes
    * def response = { items: [ { id: '3', enabled: false, foo: 1 }, { id: '1', enabled: true, foo: 1 }, { id: '2', enabled: true, foo: 1 } ] }
    * match $response.items contains deep items