Как можно смоделировать window.document для тестирования DOM-ориентированного JavaScript? - PullRequest
4 голосов
/ 17 ноября 2010

Я пытаюсь написать несколько тестов, которые вызывают 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-Maven, если это имеет какое-либо значение.

Ответы [ 4 ]

6 голосов
/ 17 ноября 2010

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

with ({window: {}}) {
     ...
}
1 голос
/ 17 ноября 2010

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

0 голосов
/ 17 ноября 2010

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

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

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

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

0 голосов
/ 17 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...