2012-08-26 2 views
2

Когда я использую nodeUnit писать модульные тесты для моделей Backbone, что-то странное случилось, вопрос можно резюмировать следующим образом:Подчеркивание IsObject() иногда не работает

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

Затем я обновляю имя игрока с: игроком. set ('name', 'Scott'). Но я обнаружил, что атрибут имени вообще не обновляется (функция проверки достоверности для этой модели не существует), и есть такие странные атрибуты, как: [0]: n, [1]: a, [2]: m, [3] : e.

Он отлично работает, если я изменил метод обновления на player.set ({name: 'Scott'}).

Я сделал некоторое быстрое исследование и обнаружил, что метод Backbone.Model.set зависит от Underscore.isObject() метода, а последний реализуются как:

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

я назвал метод IsObject() в nodeUnit и в первом случае он работает нормально, но в последнем случае он работает не так, как ожидалось, например isObject ('name') вернет true вместо ожидаемого false.

У кого-нибудь есть идеи, что вызвало это?

+0

Можете ли вы показать нам эти последние тестовые случаи? – Bergi

+0

Я могу вам показать, но я боюсь, что это не поможет: 'var requirejs = require ('requirejs'); requirejs.config ({baseUrl: 'public/javascripts'}); requirejs (["app/cards", "app/rank"], function (Cards, Rank) { export ['Card equals'] = function (test) { test.ok (Cards.smallJoker(). Равно (Cards.smallJoker())) test.done(); }; }); ' – aqingsao

ответ

1

Вы можете быть уверены, что используете последнюю версию Backbone? Магистраль в более старых версиях не поддерживала сокращенную версию метода set (.set(key, value)) и разрешала только объект с парами атрибутов/значений в качестве параметра.

(я считаю, что это был добавлен в 0.9)

+0

На самом деле да, я использую базовую версию ** 0.9.2 ** – aqingsao

+1

Это также произойдет, если имя 'была строкой, созданной с использованием' new String ('name') '- awkward, но это единственный способ, чтобы' _.isObject' возвращал 'true' с' string', это происходит в браузере или nodejs/headless env? –

+0

Спасибо Том Ту. но я не использую ничего подобного новой String (""). – aqingsao

Смежные вопросы