javascript – angular.js应用程序中配置阶段的Spyon提供程序
作者:互联网
我正在为Angular.js应用程序(使用karma和jasmine)编写单元测试,我想在模块的CONFIG阶段测试某个行为.我想确认正在调用PROVIDER的某个功能.我认为我可以通过提供者方法的间谍来做到这一点,但在“期望”之前获得对提供者的访问已被证明相当棘手.
这是一些示例代码:
模块代码(正在测试)
var myApp = angular.module('myApp', ['restangular']);
myApp.config(['RestangularProvider', function (RestangularProvider) {
RestangularProvider.setBaseUrl('http://someurl:someport/');
}]);
我已经尝试了各种解决方案来获取RestangularProvider的引用并对它应用间谍,并且都失败了.我能得到的最接近的代码如下:
单元测试代码
describe("Test if setBaseUrl was called", function () {
var RestangularProvider;
beforeEach(module('myApp', function(_RestangularProvider_) {
RestangularProvider = _RestangularProvider_;
spyOn(RestangularProvider, "setBaseUrl").and.callThrough();
}));
it("should call setBaseUrl.", function() {
expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
});
});
我实际上得到了RestangularProvider的引用,但在此之前调用了模块的“config”函数,所以我认为间谍没有得到设置.
我找到了一个帖子,其中作者通过测试配置的“服务”而不是测试对提供者方法的实际调用来解决类似情况的“解决方法”.在上面的例子中,我将在我的期望中测试Restangular.configuration.baseUrl,而不是测试对提供者的setBaseUrl方法的实际调用,但这似乎在某些情况下是不够的.
我对Angular.js比较陌生,所以这可能仅仅是对整个“测试配置阶段”完全无能为力的情况,所以如果是这样的话,请随意让我直截了当:]
有什么建议,批评或指示?
解决方法:
我终于解决了这个问题,将我想要窥探的模块分离出来,进入一个不同的“beforeEach”块.修改后的代码如下所示,但我仍然希望对这是否真的是一个“充分的测试”的整个想法有任何意见.
describe("Test if setBaseUrl was called", function () {
var RestangularProvider;
//Setup the spy.
beforeEach(function () {
module("restangular", function(_RestangularProvider_) {
RestangularProvider = _RestangularProvider_;
spyOn(_RestangularProvider_, 'setBaseUrl').and.callThrough();
});
});
beforeEach(module('myApp'));
it("should call setBaseUrl.", function() {
expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
});
});
标签:javascript,angularjs,unit-testing,karma-jasmine 来源: https://codeday.me/bug/20190624/1278214.html