我在測試指令時出現了依賴注入(理解)問題(僅當存在未決請求時才顯示AjaxLoader)。瞭解應用程序中的注入依賴和AngularJS中的測試
應用程序聲明:
angular.module('app', [
'directives.ajaxLoader',
'services.httpRequestTracker',
[...]
])
指令代碼:
angular.module('directives.ajaxLoader', [])
.directive('ajaxLoader', ['httpRequestTracker',
function(httpRequestTracker) {
return {
templateUrl: 'common/ajaxLoader.tpl.html',
link: function($scope) { // This function can have more parameters after $scope, $element, $attrs, $controller
$scope.hasPendingRequests = function() {
return httpRequestTracker.hasPendingRequests();
};
}
};
}
])
測試代碼:
describe('ajaxLoader', function() {
beforeEach(function() {
module('directives.ajaxLoader', 'common/ajaxLoader.tpl.html');
});
describe('ajaxLoader directive', function() {});
});
從那裏,我的指導工作得很好的瀏覽器,但試驗失敗出現如下錯誤:
Error: [$injector:unpr] Unknown provider: httpRequestTrackerProvider <- httpRequestTracker <- ajaxLoaderDirective
好吧,所以我需要在某處注入我的依賴項。我有兩個解決方案:
angular.module('directives.ajaxLoader', [ 'services.httpRequestTracker' ])
-
在我的測試代碼中直接
- :
-
在我的指令直接
beforeEach(function() { module('directives.ajaxLoader', 'common/ajaxLoader.tpl.html', 'services.httpRequestTracker'); });
這兩部作品,但我不瞭解哪一個更好以及爲什麼?爲什麼它從一開始就在我的瀏覽器中工作,並在我的測試中失敗?在這兩種情況下,我所有的指令和跟蹤在我的主要應用程序的聲明被注入
感謝
感謝您的詳細和啓發性的答案;)所以我的第一個解決方案'直接在我的指令'是完全禁止?我必須提供一個模擬或者在我的測試中明確地注入它? –
嘿沒有概率!你應該考慮測試環境和應用程序,就像兩件事情一樣。關於應用程序:如果你需要在你的指令中注入某些東西,那就去做吧。如果你注入它,它應該被聲明爲模塊的依賴。現在,關於測試:如果你在你的指令中注入了(過去很簡單!)的東西,它應該被模擬或者提供模擬函數的答案。 –