如何模拟window.document来测试以DOM为中心的JavaScript?

时间:2010-11-16 21:07:27

标签: javascript unit-testing testing dom

我正在尝试编写一些调用window.document的测试,我想自己模拟实际的调用,所以我可以运行它们无头。不能使用以下代码:

window = {"document": ""};
document = window.document;
document.cookie = "";
document.location = {"hostname": "test.myserver.com"}

我收到以下错误:

TypeError: Cannot set property window that has only a getter. in file:...

有没有人知道如何嘲笑这个?

我正在使用Jasmine和jasmine-maven-plugin,如果这有什么不同。

4 个答案:

答案 0 :(得分:6)

如果您必须在浏览器中运行代码,则可以将整个代码包装在with语句中:

with ({window: {}}) {
     ...
}

答案 1 :(得分:1)

如果您更改了代码以使用win Anywhere窗口,那该怎么办?然后,您可以在不测试时使用var win = window;,在测试时使用var win = {"document": ""};

答案 2 :(得分:0)

如果您在基于浏览器的内容中执行此操作,则无法通过窗口进行编写。你可以使用自定义变量而不是窗口来进行测试吗?

答案 3 :(得分:0)

如果您可以将所有代码放入单个文件中(例如,使用调用“cat”的shell脚本),这可能有效:

window.realWindow = window;

(function(){

var window = {document: {something: "hi!"}};
var document = window.document;

///////////////////////////////////
// your code goes here, for example:

function test (foo) {
 alert (document.something + " " + foo);
 realWindow.document.title = foo;
 }

test("from inside");

// to make the function "test" reachable from the outside
realWindow.global_test = test;

///////////////////////////////////

})();

global_test("from outside");

现在你的全局变量不是真正的全局变量,但是“窗口”可以在任何地方访问,并且将是你自己的版本。请注意,这将破坏一些构造,并且将使得“从外部”获取内容变得更加困难......但在许多情况下,它可能只是在不对代码进行更改的情况下工作。

编辑:添加如何从封闭功能块外部访问某些内容的示例