QUnit не запускает вручную код установки с пространством имен, как я ожидал?

В материале.js:

function init() {
    return "works";
}

(function(ParentNamespace) {
    ParentNamespace.MySubNamespace = {};
})(window.MyNamespace || (window.MyNamespace = {}));

В моем тестовом JS-файле:

/// <reference path="../../../project1/Shared/sub1/Javascript/stuff.js" />
test("foo test", function () {
    deepEqual(init(), "works", "couldn't access source JS file");
    ok(window, "no window context");
    var ns = window.MyNamespace;
    ok(ns in window, "namespace is bad");
    var ns2 = window.MyNamespace.MySubNamespace;
    ok(ns2 in window, "subnamespace is bad");
});

Я получаю 'undefined' is not an object (evaluating 'window.MyNamespace.MySubNamespace') при выполнении вышеуказанного теста с использованием адаптера для тестирования наглости. Другими словами, в строке var ns2 возникает исключение, и я никогда не дохожу до последнего утверждения ok(). Что я делаю не так? Разве qUnit/Chutzpah не должен был запускать код в stuff.js перед попыткой запустить тест?


person Patrick Szalapski    schedule 28.01.2013    source источник
comment
Если я перепишу функцию, чтобы ее можно было вызывать напрямую как foo, а затем вызову ее с помощью foo(window.MyNamespace || (window.MyNamespace = {})); перед выполнением своих утверждений, я получу неправильное пространство имен и плохое подпространство имен. Не кажется правильным.   -  person Patrick Szalapski    schedule 29.01.2013


Ответы (1)


Я изменил тест. После тестовых работ...

/// <reference path="../../../project1/Shared/sub1/Javascript/stuff.js" />
test("foo test", function () {
deepEqual(init(), "works", "couldn't access source JS file");
ok(window, "no window context");    
ok('MyNamespace' in window, "namespace is bad");    
ok('MySubNamespace' in window.MyNamespace, "subnamespace is bad");
});
person Utkarsh Patkar    schedule 30.01.2013
comment
Хорошо, но почему это не работает без одинарных кавычек? То есть почему ok(MyNamespace in window, "namespace is bad"); не проходит? - person Patrick Szalapski; 01.02.2013
comment
Это всего лишь синтаксис JavaScript. На ваш вопрос лучше всего могут ответить авторы JavaScript :) - person Utkarsh Patkar; 07.02.2013
comment
Я бы подумал, что приведенный выше синтаксис является допустимым. MyNamespace — это объект, который должен существовать; window — это существующий объект, и оператор in проверяет, является ли правый объект членом левого объекта. Что мне не хватает? - person Patrick Szalapski; 07.02.2013
comment
Как упоминалось ранее, это синтаксис. Синтаксис: propNameOrNumber в objectName, где propNameOrNumber — это строка или числовое выражение, представляющее имя свойства или индекс массива, а objectName — это имя объекта. См. developer.mozilla.org/en-US/docs/JavaScript. /Руководство/ - person Utkarsh Patkar; 08.02.2013
comment
Понял - это то, чего мне не хватало. Жаль, что в не немного более гибким. - person Patrick Szalapski; 08.02.2013