![](/img/trans.png)
[英]use $http inside custom provider in app config, angular.js
[英]Spyon provider during config phase in angular.js application
我正在為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();
});
});
如上面的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.