【问题标题】:Spyon provider during config phase in angular.js applicationangular.js 应用程序中配置阶段的 Spyon 提供程序
【发布时间】:2014-08-22 12:09:09
【问题描述】:

我正在为 Angular.js 应用程序(使用 karma 和 jasmine)编写单元测试,并且我想在模块的 CONFIG 阶段测试某种行为。我想确认正在调用 PROVIDER 的某个函数。我认为我可以在提供者的方法上使用 spy 来做到这一点,但是在“预期”被证明相当棘手之前获得对提供者的访问权限。 下面是一些示例代码:

模块代码(正在测试)

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 的引用,但是模块的“配置”函数在此之前被调用,所以我认为间谍没有得到设置。

我确实找到了一篇文章,其中作者通过测试配置的“服务”而不是测试对提供者方法的实际调用来解决类似的情况。在上面的示例中,我将在我的期望中测试Restangular.configuration.baseUrl,而不是测试对提供者的setBaseUrl 方法的实际调用,但这似乎在某些情况下是不够的。

我对 Angular.js 比较陌生,所以这可能只是对整个“测试配置阶段”一无所知的情况,所以如果是这种情况,请随时让我直截了当:]

有什么建议、批评或指点吗?

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    我最终解决了这个问题,将我想监视其提供者的模块分离到一个不同的“beforeEach”块中。更改后的代码如下,但对于这是否实际上是“充分测试”的整个想法,我仍然会很感激任何 cmets。

    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();
        });
    });
    

    【讨论】:

      【解决方案2】:

      如上面 OP 所述,您确实需要在调用要测试的模块之前获取提供程序。
      但是,没有必要将它分成两个 beforeEach 块。您还必须在 beforeEach 块的末尾调用 inject() 函数(即使您没有注入任何内容)。

      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();
          });
      
          module('myApp');
      
          inject();
        });
      
        it('should call setBaseUrl.', function() {
          expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
        });
      });
      

      来源:http://java.dzone.com/articles/unit-testing-config-and-run

      【讨论】:

        猜你喜欢
        • 2013-07-04
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        • 2020-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多