жасмин макет окна объекта - PullRequest
       34

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

41 голосов
/ 19 января 2012

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

В моем javascript у меня есть


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

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

Это моя попытка смоделировать его с "with"


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

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

        }

        with(localContext);

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

window.arguments[0]

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

Ответы [ 3 ]

60 голосов
/ 19 января 2012

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

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

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

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

youWannaTest(window);

В вашем тестовом вызове функция выглядит следующим образом:

youWannaTest({arguments: ['someValue']});
3 голосов
/ 25 марта 2017

Я также думаю, что внедрение зависимостей - самое чистое решение.

Ваш 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()
})
0 голосов
/ 29 апреля 2017

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

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

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

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

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

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