2010-11-16 3 views
4

Я пытаюсь написать несколько тестов, которые вызывают window.document, и я хочу издеваться над фактическими вызовами, поэтому я могу запустить их без головы. Bu следующий код не будет работать:Как я могу обмануть window.document для тестирования DOM-ориентированного JavaScript?

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:... 

Кто-нибудь есть идеи, как издеваются это?

Я использую Жасмин и жасмин-maven-плагин, если это имеет значение.

ответ

0

Если вы делаете это в некотором браузере, вы не сможете писать через окно. Можете ли вы выполнить свои тесты, используя пользовательскую переменную, а не окно?

1

Что делать, если вы изменили свой код, чтобы использовать окно win везде. Затем вы можете использовать var win = window;, когда не тестируете, и var win = {"document": ""}; при тестировании.

+0

Мне это нравится, но это огромное изменение кода, и я предпочел бы альтернативу, если это возможно. –

6

Если необходимо выполнить код в браузере, вы можете обернуть весь код в with заявление:

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

Если вы можете поместить весь код в одном файле (например, с помощью сценария оболочки который называет «кошка»), это может работать:

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"); 

Теперь ваши глобал не будут истинные Глобал, но «окно» можно получить доступ из любой точки, и будет ваша собственная версия. Обратите внимание, что это нарушит некоторые конструкции и затруднит доступ к вещам «извне» .... но во многих случаях это может просто работать без изменения вашего кода.

Edit: добавить пример того, как получить доступ что-то из-за пределов функционального блока вшита

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