Association d’objets partiels aux données de table [dupliquer]
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 enabled
proprié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 item
objets 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 match
de faire cela, ou dois-je recourir au script?
Réponses
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
où filterTableKeys.js
est 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