Объект жасмина

Как мне высмеять объект окна? Я занимаюсь расширением firefox, и я хочу использовать jasmine для тестирования javascript.

В моем javascript я


function submit() {
...
var url = window.arguments[0];
...
}

Очевидно, что я должен mock window.arguments [0] в жасмине, потому что этот объект не существует, если не передается какой-либо параметр из window.openDialog

Это моя попытка издеваться над этим с помощью "с"


it("should submit to server", function() {

        var localContext = {
            "window": {
                arguments: ["http://localhost"]
            }

        }

        with(localContext);

Но я все еще получаю эту ошибку TypeError: Не могу прочитать свойство '0' из undefined, он, как при запуске теста window.arguments [0], будет уничтожен реальным окном, потому что если я делаю

window.arguments[0]

внутри теста, он правильно печатает "http://localhost". но когда дело доходит до метода submit(), он показывает ошибку, что window.argument undefined.

Ответ 1

Проблема заключается в том, что вы просто перезаписываете свойство объекта window. И если вы можете это сделать, браузер может это сделать. Таким образом, издевательская функция или свойство глобального объекта, доступ к которому каждый может получить, не является хорошей идеей в целом, потому что вы никогда не можете быть уверены, что ваши изменения будут там, когда вы попытаетесь получить к ним доступ.

Что приводит меня к инъекции зависимостей. Его общий шаблон, чтобы сделать ваш блок кода проверяемым, с акцентом на unit. Что это значит. Когда вы создаете новый объект или получаете доступ к глобальному объекту, вы не только проверяете функциональность вашего подразделения, но также и функциональность вашего вновь созданного или глобального объекта. Чтобы добавить это, вы не создаете новые объекты в своем устройстве, а передаете их. Обычно вы должны это делать в конструкторе, но, как и в функции JavaScript, объекты с телом функции как конструктор, вы также можете передавать зависимости просто в свою функцию.

Таким образом, в вашем случае функция зависит от глобального объекта окна. Поэтому вместо того, чтобы пытаться получить доступ к глобальному объекту окна, передайте его в качестве параметра в свою функцию. Таким образом, вы можете передать объект окна в ваш производственный код и простой объект JavaScript с атрибутом аргумента в свой тест:

function youWannaTest(w){
    console.log(w.arguments[0]);
}

В вашем вызове расширения функция, подобная этой:

youWannaTest(window);

В тестовом вызове выполните следующие действия:

youWannaTest({arguments: ['someValue']});

Ответ 2

Я также считаю, что инъекция зависимостей является самым чистым решением.

Ваш JS:

function submit(_window) {
    _window = _window || window
    ...
    var url = _window.arguments[0];
    ...
}

Ваши юнит-тесты:

it('works like a dream', function () {
    var _window = { arguments: ['url'] }
    expect(submit(_window)).toBeTotallyAwesome()
})

Ответ 3

Да, вы можете высмеивать объект окна.

Первое, что вам нужно сделать, это сделать одно изменение в вашем JS-коде: заменить окно на $window.

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

var window = {
  arguments : ['url']
};

теперь в вашем spec файле: в блоке beforeEach

$controller('controllerName', {$window : window});