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