2016-04-27 3 views
1

J'ai quelques tests qui appellent une API HTTP. Je me suis moqué d'eux et j'utilise un constructeur pour créer le JSON approprié afin de donner plus de sens. J'ai utilisé des modèles similaires dans d'autres langues et j'essaie d'obtenir ce travail en JavaScript. Le problème que j'ai est que même si ce que je crée via le constructeur et l'objet json que je construis manuellement me paraissent égaux, ils ne sont pas aussi loin que je le devrais.Egalité des objets profonds Javascript lorsque l'objet est créé via une chaîne json vs builder

Je lié un violon qui, espérons assez clair pour comprendre: https://jsfiddle.net/sp89cc95/

Mon constructeur est la suivante:

var PersonBuilder = function() { 
    this.name = "Bob" 
    this.age = 25 
    this.hobbies = ["Coding"] 
} 

PersonBuilder.prototype.withName = function(name) { 
    this.name = name; 
    return this; 
} 

PersonBuilder.prototype.withAge = function(age) { 
    this.age = age; 
    return this; 
} 

PersonBuilder.prototype.withHobby = function(hobby) { 
    this.hobbies = [hobby] 
    return this; 
} 

PersonBuilder.prototype.addHobby = function(hobby) { 
    this.hobbies.push(hobby) 
    return this; 
} 

Ensuite, ma configuration de test est simplement

var builder = new PersonBuilder(); 
var expected = { 
    "name": "Bob", 
    "age": 25, 
    "hobbies": ["Coding"] 
} 

Et la affirmation:

builder.should.eql(expected); 

Cette assertion échoue. Lorsque j'inspecte les objets, ils impriment tous les deux

{"name":"Bob","age":25,"hobbies":["Coding"]} 

Mes observations de débogage sont que le tableau est à l'origine du problème. Quand je console.log l'objet montre [Object]. Mais si je me connecte juste le tableau, je reçois ['Coding'].

Je peux extraire le contenu des tableaux manuellement et comparer leur égalité, mais je pensais que la vérification d'égalité en profondeur de should.eql ferait cela pour moi.

Toute aide serait grandement appréciée. S'il y a de meilleures façons d'écrire des constructeurs ou de tester leurs résultats, je suis tout ouïe. C'est la solution trouvée de quelques heures de googling et quelques essais et erreurs. Je suis sûr que c'est quelque chose de simple, je suis juste manquant.

Merci à l'avance

+1

Essayez 'JSON.stringify (builder) .should.eql (JSON.stringify (attendu));' – alexmac

+0

Merci pour la réponse, je pense qu'avoir une fonction de construction est la meilleure façon depuis que cela me permet de vérifier l'égalité de l'objet lui-même et non son rendu. Bien que dans ce cas, il produirait le même résultat. – Shifty

Répondre

2

Le manque d'égalité peuvent être dues à des méthodes prototypes, essayez d'ajouter la méthode de construction qui crée un objet avec des attributs et aucune méthode de prototype.

+0

Merci, ça a marché pour moi. J'ai mis à jour mon violon avec le test qui passe maintenant: https://jsfiddle.net/kyvtbbes/2/. Je me demande s'il existe une façon plus élégante de cloner un objet sans ses prototypes? – Shifty

+0

Utilisez la bibliothèque 'lodash' pour cela:' var builder = _.pickBy (nouveau PersonBuilder(), fonction (v) {return! _. IsFunction (v);}) ' – alexmac