2012-08-26 5 views
2

Lorsque j'utilise nodeUnit pour écrire des tests unitaires pour les modèles de Backbone, quelque chose de bizarre est arrivé, la question peut se résumer comme:Souligné IsObject() parfois fonctionne pas

var Player = Backbone.Model.extend({}); 
var player = new Player({name: 'Jacky'}); 

ensuite mettre à jour le nom du joueur avec: joueur. set ('nom', 'Scott'). Mais j'ai trouvé que l'attribut name n'est pas du tout mis à jour (pas de fonction validate pour ce modèle), et il y a des attributs bizarres comme: [0]: n, [1]: a, [2]: m, [3] : e.

Cela fonctionne très bien si j'ai changé la méthode de mise à jour en player.set ({name: 'Scott'}).

J'ai fait quelques enquête rapide et a constaté que la méthode Backbone.Model.set dépend de la méthode Underscore.isObject(), et celui-ci est mis en œuvre:

_.isObject = function(obj) { 
    return obj === Object(obj); 
    }; 

J'ai appelé la méthode IsObject() dans nodeUnit cas de test, et dans le premier cas cela fonctionne bien, mais dans les derniers cas, cela ne fonctionne pas comme prévu, par exemple isObject ('nom') retournera vrai au lieu du faux attendu.

Quelqu'un at-il une idée de ce qui a causé cela? Pouvez-vous vous assurer que vous utilisez la dernière version de Backbone?

+0

Pouvez-vous nous montrer ces derniers cas de test? – Bergi

+0

Je peux vous montrer, mais je crains que cela n'aide pas: 'var requirejs = require ('requirejs'); requirejs.config ({baseUrl: 'public/javascripts'}); requirejs (["app/cards", "app/rank"], function (Cartes, Rang) { exports ['Carte égale'] = fonction (test) { test.ok (Cards.smallJoker() est égal à (Cards.smallJoker()));; test.done(); }; }); ' – aqingsao

Répondre

1

Backbone dans les anciennes versions ne prend pas en charge la version de raccourci pour la méthode set (.set(key, value)) et autorisé uniquement objet avec des paires attribut/valeur en tant que paramètre.

(je crois qu'il a été ajouté à 0,9)

+0

En fait oui, j'utilise la version backbone ** 0.9.2 ** – aqingsao

+1

Cela se produirait aussi si le' nom 'était une chaîne créée en utilisant le' new String ('name') '- maladroit mais c'est la seule façon' _.isObject' retournerait 'true' avec une' chaîne' cela arriverait-il dans browser ou nodejs/headless env? –

+0

Merci Tom Tu. mais je n'utilise rien comme une nouvelle chaîne (""). – aqingsao

Questions connexes