2017-09-08 1 views
0

Chai 4 et .nested.property()était .deep.property() dans les versions antérieures. La question que je décris est présent à la fois avec .nested.property() Chai 4 ou version ultérieure et avec .deep.property() dans les versions antérieures à 4.Impossible de vérifier une propriété d'objet imbriqué en utilisant le drapeau ".nested" et la notation de parenthèse

J'ai essayé d'utiliser la notation du drapeau .nested et le support pour vérifier la valeur d'un imbriquée propriété. Lorsque j'essaie de m'adresser dans des tableaux, cela fonctionne, mais si je veux m'adresser à un objet en faisant "a['name']", cela ne fonctionne pas. Ceci est déroutant car, en JavaScript, a.name et a["name"] feraient tous deux référence à la même propriété, et dans certains cas, nous devions utiliser les parenthèses en raison de la structure du nom.

J'ai un exemple du problème ci-dessous. Si vous exécutez cela, vous verrez "first expect passed", mais vous ne verrez pas "second expect passed" car la deuxième assertion échoue.

const { expect } = require("chai"); 

const obj = { 
    "a": ["foo", "bar"], 
    "b": { "foo-bar": 1}, 
}; 

expect(obj).to.have.nested.property("a[1]").equal("bar"); 
console.log("first expect passed"); 


expect(obj).to.have.nested.property("b['foo-bar']").equal(1); 
console.log("second expect passed"); 

Répondre

0

Ce n'est pas clairement documentée mais le problème est que Chai n'interprétait en fait passer l'argument que vous .property de la même manière exacte un interpréteur JavaScript serait. Il est naturel d'aller avec b['foo-bar'] parce que c'est ce que vous attendez de avoir à faire si vous accédiez à la propriété dans le code JavaScript, mais cela ne fonctionnera pas avec Chai. Qu'est-ce que vous avez à faire est:

expect(obj).to.have.nested.property("b.foo-bar").equal(1); 
console.log("second expect passed"); 

La notation de support dans .property est essentiellement que pour l'adressage dans des tableaux. Quand il s'agit d'objets, vous devez utiliser la notation par points, même dans les cas où ce serait JavaScript invalide.