Association d’objets partiels aux données de table [dupliquer]

Nov 20 2020

J'évalue actuellement le karaté en remplacement de nos propres tests d'API maison. J'ai un service renvoyant des données comme ceci:

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

Les propriétés de chaque élément appartiennent à des fonctionnalités différentes, et je voudrais les tester séparément.

Par exemple, pour tester l'activation des éléments, je voudrais vérifier que la enabledpropriété a la valeur correcte pour un élément donné id.

J'ai essayé de l'installer comme ça;

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

Les itemobjets réels sont assez volumineux, contenant beaucoup plus de propriétés et d'objets imbriqués, et je préfère ne pas spécifier la structure attendue complète car ils se rapportent à de nombreuses fonctionnalités différentes, et certaines propriétés sont de nature dynamique.

Y a-t-il un moyen élégant matchde faire cela, ou dois-je recourir au script?

Réponses

2 HenrikGustafsson Nov 20 2020 at 16:12

Cela semble faire la bonne chose;

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

filterTableKeys.jsest défini comme

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

Cela ne semble pas très élégant, donc toute indication sur la façon dont cela pourrait être fait plus déclaratif / moins impératif / "scripty" serait appréciée.


Éditer

Comme Babu Sekaran l'a noté ci-dessous, cela semble bien fonctionner

  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