2016-09-29 5 views
1

実際に起動する前にバックエンドから設定を読み込む必要があるAngularアプリがあります。私はアプリケーションのE2Eテストを書く必要があるので、バックエンドとは独立しています。私はこの目的のためにprotractor-http-mockを使用しました。最初はangular-deferred-bootstrapモジュールが設定依存関係を管理していましたが、私のportalモジュールが完全にブートストラップされる前に動作するので、分度器はhttpMockモジュールをこの段階に注入していません。私の次の決定は、別のモジュールportalBootstrapにブートストラッププロセスを回すことだった:複数のAngularモジュールでprotractor-http-mockを使用

  1. addMockModuleが呼び出され、httpMockが分度器の内部モックモジュールに入った:私はそれを理解し、模擬モジュールの注入はこのように書き

    angular 
        .module('portalBootstrap', []) 
        .run(['$http', '$q', '$log', '$location', ($http, $q, $log, $location) => { 
         bootstrap($http, $q, $log, $location).then(config => { 
          angular.module('portal').constant('conf', config); 
          var injector = angular.bootstrap(document, ['portal']); 
         }); 
        }]); 
    
    angular.element(document).ready(() => { 
        var bootstrapElement = document.getElementById('bootstrap'); 
        var injector = angular.bootstrap(bootstrapElement, ['portalBootstrap']); 
    }); 
    

    レジストリ

  2. browser.getが呼び出されます
  3. 角度が利用可能になるまで待って、ブートストラップを一時停止します
  4. 分度器はhttpMockselenium
  5. に、分母はすべて引数としてモジュール名を提供するangular.resumeBootstrapを呼び出します。したがって、モジュールインジェクタはそれらと共に作成されます。この時点httpMock

portalBootstrapからアクセス可能であると$http要求が嘲笑ます。

問題は、第二のモジュール(portalが)browser.getportalBootstrapは、その構成を受け取り、portalに移り、現時点で実行されていないとして、非常に明白である何httpMockモジュールのコピーを受信して​​いないということになりました。

protractorは両方のモジュールにhttpMockを注入できますか?あるいは、ブートストラップのアーキテクチャの変更の一部をお勧めしますか?

はテスト環境以外では存在しないため、angular.module('portal', ['httpMock'])のようなハードコーディングは避けてください。

答えて

0

このように、唯一のportal、手動では、あなたのportalBootstrapを注入ブートストラップにしてください:

angular 
    .module('portalBootstrap', []) 
    .run(['$http', '$q', '$log', '$location', ($http, $q, $log, $location) => { 
     bootstrap($http, $q, $log, $location).then(config => { 
      angular.module('portal').constant('conf', config); 
      var injector = angular.bootstrap(document, ['portal']); 
     }); 
    }]); 

angular.element(document).ready(() => { 
    var injector = angular.injector(['portalBootstrap']); 
}); 

あなたは$locationのような$rootElementまたは角度のサービスを持っている必要がある場合は、あなたがこのような偽の$rootElementを行うことができます

angular 
    .module('portalBootstrap', []) 
    .run(['$http', '$q', '$log', '$location', ($http, $q, $log, $location) => { 
     bootstrap($http, $q, $log, $location).then(config => { 
      angular.module('portal').constant('conf', config); 
      var injector = angular.bootstrap(document, ['portal']); 
     }); 
    }]); 

angular.element(document).ready(() => { 
    var bootstrapElement = document.getElementById('bootstrap'); 
    var ngBootstrapElement = angular.element(bootstrapElement); 
    angular.module('portalBootstrap').constant('$rootElement', ngBootstrapElement); 
    var injector = angular.injector(['portalBootstrap']); 
}); 
関連する問題