2017-01-27 17 views
1

Я пытаюсь написать модульные тесты для углового обслуживания с жасмином/кармой. У меня есть аналогичный сервисный тест, который работает отлично. Но у этого есть некоторые дополнительные зависимости, он находится в другом модуле и просто не находит службу с помощью инъекции.Единичное тестирование углового обслуживания, beforeEach инъекции не выполняется

Служба выглядит примерно так. bService находится в том же модуле, но commonFactory и commonService находятся в другом модуле, скажем commonModule.

(function() { 
    'use strict'; 
    angular 
     .module('myService') 
     .service('aService', aService); 

    aService.$inject = [ 
     'commonFactory', 
     'commonService' 
     'bService' 
    ]; 

    function aService (
     commonFactory, 
     commonService, 
     bService 
    ) { 

    }; 

    return { 
     codeIWantToTest: CodeIWantToTest; 
    } 

    function CodeIWantToTest() { 
      console.log('surprise!'); 
    } 
})(); 

Мой тест жасмин выглядит следующим образом:

describe('myService.aService', function() { 
    'use strict'; 
    var aService; 
    // I tried adding beforeEach(module('commonModule')); too, but that didn't do anything 
    beforeEach(module('myService')); 

    beforeEach(function() { 
     inject(function(_aService_) { 
      console.log('getting aService'); 
      aService = _aService_; 
     }); 
    }); 

    it('tests my service is defined', function() { 
     expect(myService).toBeDefined(); 
    }); 
}); 

Этот тест не удается. myService не определен и console.log в функции впрыска не срабатывает. Мой karma.conf.js в основном перечисляет зависимости в том порядке, в котором они были введены в службу, а затем добавляет службу, затем тест.

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

+0

Обычно вы не тестируете службы, а результат обслуживания в контроллере. –

+0

Отредактированный код, добавлен отсутствующий '' 'на' bService'. В случае, если это не проблема, просто от копирования до SO. – ste2425

+0

отсутствует '' 'в конце' aService = _aService_'. – shelbydz

ответ

2

Другой разработчик моей команды нашел решение, и я хотел опубликовать его как ответ для будущих людей. У меня было ощущение, что это проблема зависимости, и это было так. Хотя мы правильно загружали все JS-файлы, шаблон, используемый компонентом, загружал другую js-зависимость. Таким образом, чтобы исправить это для жасмин, у нас было два различных решения:

в верхней части тестового компонента файла, мы могли бы добавить:

beforeEach(function() { 
    module(function ($provide) { 
     $provide.constant('myMissingDependency', { 
      // do things to load the dependency here 
      }); 
    }); 
}); 

В нашем случае это была библиотека перевод

The другим решением было добавить файл «shim» в каталог тестовых модулей и загрузить его с помощью karma.config.js перед тестированием. Это выглядело как:

(function() { 
    angular 
     .module('MyService') 
     .constant('myMissingDependency', Object.freeze({ 
      // things to load the dependency 
     })); 
})(); 

Я не смог переключиться на Chrome, потому что мы используем Докер, и я не мог получить тесты запустить локально для запуска Chrome. Поэтому добавление второго набора глаз к этому было тем, что мне было нужно.