我正在和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
答案 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);
});
});
请注意,我没有测试过代码,但你应该得到要点。