Javascript QUnit不是';是否像我预期的那样手动运行名称空间设置代码?

Javascript QUnit不是';是否像我预期的那样手动运行名称空间设置代码?,javascript,qunit,chutzpah,Javascript,Qunit,Chutzpah,在stuff.js中: function init() { return "works"; } (function(ParentNamespace) { ParentNamespace.MySubNamespace = {}; })(window.MyNamespace || (window.MyNamespace = {})); 在我的测试JS文件中: /// <reference path="../../../project1/Shared/sub1/Javascr

在stuff.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");
});
//
测试(“foo测试”,函数(){
deepEqual(init(),“works”,“无法访问源JS文件”);
ok(窗口,“无窗口上下文”);
var ns=window.MyNamespace;
ok(窗口中的ns,“名称空间不好”);
var ns2=window.MyNamespace.MySubNamespace;
ok(窗口中的ns2,“子名称空间不好”);
});

当使用Chutzpah测试适配器运行上述测试时,我得到的
“undefined”不是对象(评估“window.MyNamespace.MySubNamespace”)
。也就是说,在
var ns2
行上抛出了一个异常,而我从来没有得到最后一个
ok()
断言。我做错了什么?qUnit/Chutzpah不应该在尝试运行测试之前运行stuff.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");    
ok('MyNamespace' in window, "namespace is bad");    
ok('MySubNamespace' in window.MyNamespace, "subnamespace is bad");
});
//
测试(“foo测试”,函数(){
deepEqual(init(),“works”,“无法访问源JS文件”);
ok(窗口,“无窗口上下文”);
ok('MyNamespace'在窗口中,“名称空间不好”);
ok(window.MyNamespace中的“MySubNamespace”,“subnamespace不好”);
});

如果我将函数重写为可直接调用为foo,然后使用
foo(window.MyNamespace | |(window.MyNamespace={})调用它在执行断言之前,我得到“名称空间不好”和“子名称空间不好”。似乎不对。好吧,但是为什么没有单引号它就不能工作呢?也就是说,为什么不
ok(窗口中的MyNamespace,“namespace是坏的”)通过?这只是一个JavaScript语法。JavaScript的作者可以最好地回答您的问题:)我认为上面的语法是有效的
MyNamespace
是应该存在的对象<代码>窗口
是一个存在的对象,并且
中的
操作符测试右侧对象是否是左侧对象的成员。我遗漏了什么?正如前面提到的,这是语法。语法为“objectName中的propNameOrNumber”,其中propNameOrNumber是表示属性名称或数组索引的字符串或数值表达式,而objectName是对象的名称。请参考我的答案——这就是我所缺少的。糟糕的是,“in”并没有更灵活一点。