Жасмин: создать шпион на оконные объекты, которые не существуют

Я создаю приложение cordova / phonegap вместе с AngularJS. В моем приложении я использую некоторые родные плагины от cordova, такие как плагин геолокации.

Во время моих тестов, эти плагины не доступны (потому что отсутствует телефонный разрыв), $window.plugins возвращается undefined в моих тестах. И, конечно же, $window.plugins.anotherPlugin также не удается.

Поэтому я должен макетировать эти части для моих испытаний. В настоящее время я делаю это так

  beforeEach(function() {
    $window.plugins = {
      anotherPlugin: {
        foo: function() {}
      }
    };
  });

Но что, если в будущем другая библиотека использует $window.plugins пространство имен, и я перезаписываю его в своих тестах? Это сломало бы другие тесты. С помощью описанного выше способа мне нужно будет выполнить некоторую очистку после тестов, чтобы убедиться, что старые значения $window.plugins установлены обратно. Я думаю, этот способ не очень чистый, и мне интересно, есть ли лучший способ сделать это с жасмином.

Итак, мой вопрос: как я могу шпионить за $window.plugins.anotherPlugin создавая фиктивные функции с жасмином, не влияя на другие тесты, когда $window.plugins не существует?

1 ответ

Решение

Вы должны загрузить модуль части, которую вы хотите протестировать, и сгенерировать фиктивный модуль, который предоставляет шпионы.

beforeEach(function () {
    module('ModuleUnderTest', function($provide) {
        var windowMock = {
            plugins: {
                anotherPlugin: jasmine.createSpyObj('anotherPlugin', ['foo', 'bar'])
            }
        };

        // substitute all dependencies with mocks
        $provide.value('$window', windowMock);
    });
});

Осторожно, я не проверял код, но вы должны понять суть.

Другие вопросы по тегам