自分のAngularプロバイダーをテストする必要があります。また、構成フェーズと実行フェーズの両方でテストして、構成メソッドが機能し、インスタンス化されたプロバイダーが実際に正しいパラメーターで構成されていることを確認する必要があります。
プロバイダーに依存関係インジェクションを要求すると、APIResourceFactoryProviderが見つからず、APIResourceFactoryのみが見つかります。これまでに調べたリポジトリーでは、この例は見つかりませんでした。
自分のAngularプロバイダーをテストする必要があります。また、構成フェーズと実行フェーズの両方でテストして、構成メソッドが機能し、インスタンス化されたプロバイダーが実際に正しいパラメーターで構成されていることを確認する必要があります。
プロバイダーに依存関係インジェクションを要求すると、APIResourceFactoryProviderが見つからず、APIResourceFactoryのみが見つかります。これまでに調べたリポジトリーでは、この例は見つかりませんでした。
実際には、AngularJSでプロバイダーを最初にテストするように見えるよりもはるかに簡単です。
describe('Testing a provider', function() {
var provider;
beforeEach(module('plunker', function( myServiceProvider ) {
provider = myServiceProvider;
}));
it('should return true on method call', inject(function () {
expect( provider.method() ).toBeTruthy();
}));
});
`` `
証拠はプランカーにあります:http://plnkr.co/edit/UkltiSG8sW7ICb9YBZSH
プロバイダーの縮小防止バージョンが必要な場合に備えて、状況は少し複雑になります。
プロバイダーコードは次のとおりです。
angular
.module('core.services')
.provider('storageService', [function () {
function isLocalStorageEnabled(window) {
return true;
}
this.$get = ['$window', 'chromeStorageService', 'html5StorageService',
function($window, chromeStorageService, html5StorageService) {
return isLocalStorageEnabled($window) ? html5StorageService : chromeStorageService;
}];
}]);
テストケース:
describe('Storage.Provider', function() {
var chrome = {engine: 'chrome'};
var html5 = {engine: 'html5'};
var storageService, provider;
beforeEach(module('core.services'));
beforeEach(function () {
module(function (storageServiceProvider) {
provider = storageServiceProvider;
});
});
beforeEach(angular.mock.module(function($provide) {
$provide.value('html5StorageService', html5);
$provide.value('chromeStorageService', chrome);
}));
// the trick is here
beforeEach(inject(function($injector) {
storageService = $injector.invoke(provider.$get);
}));
it('should return Html5 storage service being run in a usual browser', function () {
expect(storageService).toBe(html5);
});
});
この場合、$ getは配列であり、依存関係を引数として提供する通常の関数として呼び出すことはできません。解決策は$injector.invoke()を使用することです。
ほとんどのチュートリアルとサンプルがこの詳細を見逃しているのは奇妙なことです。
これは、フェッチプロバイダーを適切にカプセル化して、個々のテスト間の分離を確保するための小さなヘルパーです。
/**
* @description request a provider by name.
* IMPORTANT NOTE:
* 1) this function must be called before any calls to 'inject',
* because it itself calls 'module'.
* 2) the returned function must be called after any calls to 'module',
* because it itself calls 'inject'.
* @param {string} moduleName
* @param {string} providerName
* @returns {function} that returns the requested provider by calling 'inject'
* usage examples:
it('fetches a Provider in a "module" step and an "inject" step',
function() {
// 'module' step, no calls to 'inject' before this
var getProvider =
providerGetter('module.containing.provider', 'RequestedProvider');
// 'inject' step, no calls to 'module' after this
var requestedProvider = getProvider();
// done!
expect(requestedProvider.$get).toBeDefined();
});
*
it('also fetches a Provider in a single step', function() {
var requestedProvider =
providerGetter('module.containing.provider', 'RequestedProvider')();
expect(requestedProvider.$get).toBeDefined();
});
*/
function providerGetter(moduleName, providerName) {
var provider;
module(moduleName,
[providerName, function(Provider) { provider = Provider; }]);
return function() { inject(); return provider; }; // inject calls the above
}