Jasmine:在不存在的窗口对象上创建间谍

时间:2014-05-12 08:24:13

标签: angularjs cordova jasmine spy

我正在和AngularJS一起构建一个cordova / phonegap应用程序。在我的应用程序中,我使用了一些来自cordova的本机插件,就像地理定位插件一样。

在我的测试期间,此插件不可用(因为没有手机屏幕),$window.plugins在我的测试中返回undefined。当然,$window.plugins.anotherPlugin也失败了。

因此,我必须为我的测试模拟这些部分。目前,我正是这样做的

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

但是如果将来另一个库使用$window.plugins命名空间,我会在测试中覆盖它呢?这会破坏其他测试。通过上面的方法,我必须在测试后进行一些清理,以确保$window.plugins的旧值被设置回来。我想,这种方式不是很干净,我想知道是否有更好的方法用茉莉花来做这件事。

所以我的问题是:$window.plugins.anotherPlugin不存在时,如何通过使用jasmine创建虚函数而不影响其他测试来监视$window.plugins

1 个答案:

答案 0 :(得分: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);
    });
});

请注意,我没有测试过代码,但你应该得到要点。