10

自分のAngularプロバイダーをテストする必要があります。また、構成フェーズと実行フェーズの両方でテストして、構成メソッドが機能し、インスタンス化されたプロバイダーが実際に正しいパラメーターで構成されていることを確認する必要があります。

プロバイダーに依存関係インジェクションを要求すると、APIResourceFactoryProviderが見つからず、APIResourceFactoryのみが見つかります。これまでに調べたリポジトリーでは、この例は見つかりませんでした。

4

3 に答える 3

21

実際には、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

于 2013-04-05T07:38:44.930 に答える
1

プロバイダーの縮小防止バージョンが必要な場合に備えて、状況は少し複雑になります。

プロバイダーコードは次のとおりです。

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()を使用することです。

ほとんどのチュートリアルとサンプルがこの詳細を見逃しているのは奇妙なことです。

于 2016-09-07T16:44:15.580 に答える
0

これは、フェッチプロバイダーを適切にカプセル化して、個々のテスト間の分離を確保するための小さなヘルパーです。

  /**
   * @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
  }
  • プロバイダーをフェッチするプロセスは完全にカプセル化されています。テスト間の分離を損なうクロージャー変数は必要ありません。
  • プロセスは、「モジュール」ステップと「注入」ステップの2つのステップに分割できます。これらは、単体テスト内で「モジュール」および「注入」への他の呼び出しと適切にグループ化できます。
  • 分割が必要ない場合は、プロバイダーの取得を1つのコマンドで簡単に実行できます。
于 2015-04-22T22:19:06.313 に答える