2015-02-25 3 views
0

ОБНОВЛЕНИЕ: Разработано решение, с которым мне удобно, ответ ниже.Испытание модуля Угловой код начальной загрузки

У меня есть приложение, которое использует ручную самонастройку с куском кода, который по существу выглядит следующим образом:

(function() { 
    'use strict'; 
     angular.element(document).ready(function() { 

      function fetchLabels(sLang, labelPath) { 
       // retrieves json files, builds an object and injects a constant into an angular module 
      } 

      function rMerge(oDestination, oSource) { 
       // recursive deep merge function 
      } 

      function bootstrapApplication() { 
       angular.element(document).ready(function() { 
        angular.bootstrap(document, [ 'dms.webui' ]); 
       }); 
      } 

      fetchLabels('en_AU').then(bootstrapApplication); 

     } 

Он отлично работает - по существу извлекает два JSon файлов, объединяют их и вводит результат в виде константа, затем загружает приложение.

Мой вопрос заключается в том, как выполнить тестирование этих функций? Я хочу написать что-то, чтобы протестировать методы fetchLabels() и rMerge(), но я не уверен, как это сделать. Моя первая мысль заключалась в том, чтобы разделить методы на службу и использовать ее таким образом, но я не был уверен, могу ли я фактически вызвать свою собственную службу таким образом, прежде чем я даже загрузил приложение?

В противном случае, может ли кто-нибудь предложить способ отделить эти методы от чего-то автономного, что я могу проверить с большей готовностью?

+0

Эти функции делают что-то настолько сложное, что вам нужно проверить их реализации? Почему бы просто не проверить результат *, утверждая, что ваша постоянная инъекция имеет правильные значения? – user2943490

+0

Вы правы, я могу просто проверить результат ради обеспечения полной концепции, но я хотел бы приложить тесты к методам, чтобы мы могли поймать любые регрессии, если будущий разработчик внесет изменения в сами методы. –

ответ

0

ОК после некоторых попыток, я нашел решение, которым я доволен.

Я переместил методы в службу ярлыков и модифицировал файл модулей меток, чтобы предварительно установить пустой объект в соответствующую константу.

Я добавил исключение из моей установки инъекции grunt, чтобы игнорировать файлы служебных данных ярлыков и вместо этого вручную ихменовал ранее, когда я вызываю сам файл модуля.

Я взял код прямой инъекции для $ http и $ q из сценария начальной загрузки и поместил их в службу Label, так как они недоступны для обычной инъекции до начальной загрузки.

Наконец, я вручную загрузил модуль этикеток, ввел службу Labels, а затем использовал сервис Labels для выполнения вышеупомянутых методов.

Так что мой скрипт начальной загрузки теперь выглядит следующим образом:

(function() { 
    'use strict'; 
    var injector = angular.injector([ 'labels' ]); 
    var Labels = injector.get('Labels'); 

    /** 
    * Executes the actual bootstrapping 
    */ 
    function bootstrapApplication() { 
     angular.element(document).ready(function() { 
      angular.bootstrap(document, [ 'myAppModule' ]); 
     }); 
    } 

    // get the label files and build the labels constant, then load the app 
    Labels.fetchLabels('en_AU', '/lang/').then(bootstrapApplication); 

})(); 

И я могу правильно модульное тестирование сервиса этикетки дискретно. Заказ на загрузку и добавление дополнительных битов в обычный способ загрузки модулей для нас является исключением, но мне комфортно, что это конкретная цель гарантирует исключение, и это оставляет нас в гораздо более гибкой позиции для тестирования.

Смежные вопросы