Иногда у вас может быть библиотека, которая изменяет window.location, и вы хотите, чтобы она работала нормально, но также была протестирована. Если это так, вы можете использовать закрытие, чтобы передать желаемую ссылку в вашу библиотеку, такую как эта.
/* in mylib.js */
(function(view){
view.location.href = "foo";
}(self || window));
Затем в своем тесте, перед тем как включить свою библиотеку, вы можете переопределить себя глобально, и библиотека будет использовать макет себя в качестве представления.
var self = {
location: { href: location.href }
};
В вашей библиотеке вы также можете сделать что-то вроде следующего, поэтому вы можете переопределить себя в любой момент теста:
/* in mylib.js */
var mylib = (function(href) {
function go ( href ) {
var view = self || window;
view.location.href = href;
}
return {go: go}
}());
В большинстве, если не во всех современных браузерах, self уже является ссылкой на окно по умолчанию. На платформах, которые реализуют Worker API, внутри Worker self есть ссылка на глобальную область. В node.js и self, и window не определены, поэтому, если вы хотите, вы также можете сделать это:
self || window || global
Это может измениться, если node.js действительно реализует Worker API.