2016-09-29 5 views
1

У меня есть приложение с угловыми углами, которое должно загружать конфигурацию из бэкэнда до его фактического запуска. Мне нужно написать тесты E2E для приложения, так что он не зависит от бэкэнд. Для этой цели я использовал protractor-http-mock. Первоначально был модуль angular-deferred-bootstrap, управляющий конфигурационной зависимостью, но он работает до того, как мой модуль portal полностью загружен, поэтому транспортир не впрыскивает модуль httpMock на этом этапе. Мое следующее решение было превратить самозагрузки процесс в отдельный модуль portalBootstrap:Использование protractor-http-mock в нескольких Угловых модулях

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']); 
}); 

Как я понимаю, фиктивные модули впрыска выглядит следующим образом:

  1. addMockModule называется и httpMock попадает во внутренний макете модуль транспортир в реестр
  2. browser.get
  3. транспортир ждет, пока угловой не будет доступен и остановит его ботстрап
  4. транспортир впрыскивает httpMock в selenium
  5. транспортир называет angular.resumeBootstrap предоставление всех фиктивных модулей имена в качестве аргумента, поэтому модуль форсунки создается с ними.

На данный момент httpMock доступен из portalBootstrap и $http просьбы получить издевались.

Проблема теперь, что второй модуль (portal) не получает копию httpMock модуля, что вполне очевидно, как browser.get не выполняется в тот момент, когда portalBootstrap получает свою конфигурацию и переходит к portal.

Возможно ли, что protractor может вводить httpMock в оба модуля? Или, может быть, некоторые изменения в архитектуре начальной загрузки рекомендуется?

Следует избегать любого жесткого кодирования, такого как angular.module('portal', ['httpMock']), поскольку httpMock нет в не тестируемой среде.

ответ

0

Try для начальной загрузки только 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']); 
}); 

Если вам нужно иметь $rootElement или угловые услуги, такие как $location, вы можете подделать $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']); 
});