在angular.js应用程序的配置阶段期间的Spyon提供程序

时间:2014-07-01 20:19:12

标签: javascript angularjs unit-testing karma-jasmine

我正在为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比较陌生,所以这可能仅仅是对整个“测试配置阶段”完全无能为力的情况,所以如果是这样的话,请随意让我直截了当:]

有任何建议,批评或指示吗?

2 个答案:

答案 0 :(得分:4)

我终于解决了这个问题,将我想要监视的提供者分离出来,进入一个不同的“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();
    });
});

答案 1 :(得分:0)

如上面的OP所述,您需要在调用要测试的模块之前获取提供程序 但是,没有必要将它分成两个beforeEach块。您还必须在inject()块的末尾调用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();
    });

    module('myApp');

    inject();
  });

  it('should call setBaseUrl.', function() {
    expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
  });
});

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