编程语言
首页 > 编程语言> > javascript – angular.js应用程序中配置阶段的Spyon提供程序

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