Внедрение mock angular служебных зависимостей

У меня есть служба "Входы", определенная в модуле "Puts", которая зависит от второй службы "InputCreator". Мне нужно заглушить службу InputCreator, чтобы протестировать службу Inputs.

Как я понимаю answer here > , я должен создать модуль, содержащий мою службу-заглушку, а затем создать новый модуль "Тест" , указав модуль тестируется, а затем модуль заглушки в качестве зависимостей. А затем вытащите сервис из инжектора. Например:

beforeEach(function() {

  angular.module.('Puts'); // contains the service 'Inputs'

  angular.module('Mocks',[])
    .service('InputCreator',function(){
      var mockInputs = {
        //stubbed behaviour goes here
      };
      return mockInputs;
    });
  });

  angular.module('Test',['Puts', 'Mocks'];

  inject(function($injector){
    Inputs = $injector.get('Inputs');
  });
});

Однако функция инжектора отвечает "неизвестным InputsProvider < - Inputs".

Где я сбился с пути?

Спасибо!

Ответ 1

Выяснив это, я подумал, что отвечу на свой вопрос. Большая ошибка выше заключалась в использовании angular.module, а не angular.mock.module, что называется удобством, называемым модулем angular -mock. Они совсем не то же самое!

Кроме того, достаточно инициализировать макет службы с помощью angular.mock.module, пока вы это сделаете, прежде чем инициализировать тестируемый модуль. Там нет необходимости в этом "обертывании модулей в третьем модуле", как это было предложено в упомянутом выше вопросе. К остроумию:

describe("Test Service", function() {
  var TestService, getvaluestub;

  beforeEach(function() {

    // create mock service
    var mock = {getvalue:function(){}}

    angular.module('dependencymodule',[])
      .service('dependencyservice',function () {
        return mock;
      });

    //mock the function we are stubbing, (that, in this case, returns value 4)
    getvaluestub = sinon.stub(mock,'getvalue')returns(4);

    //instantiate your mock service
    module('dependencymodule');

    //instantiate the module of the service under test, 
    //that depends on 'dependencyservice' mocked above 
    //(ie - testmodule includes the     service 'testservice')
    module('testmodule');

    //inject your test service for testing
    inject(function ($injector) {
        TestService = $injector.get('testservice');
    })

  //tests go here.....

Если модуль зависимостей уже существует, вы можете либо выполнить все вышеперечисленное, либо получить услугу из инжектора $, вставить шпионы и заглушки, а затем > lt; создать экземпляр тестируемой службы. Важно, чтобы шпионы/заглушки были установлены > до < зависимая служба создается или создается без них. Это выглядит так:

describe("Test Service", function() {
  var TestService, DependencyService, getvaluestub;

  beforeEach(function() {

    // these modules are specified in the application
    module('dependencymodule');
    module('testmodule');

    inject(function ($injector) {
      DependencyService = $injector.get('testservice');

      getvaluestub = sinon.stub(DependencyService,'getvalue').returns(4);

      OtherService = $injector.get('otherservice');
    })
  });

// test go here

Итак, вы идете. Надеюсь, это полезно для тех, кто ищет "Инъекции в нас" в angular services ".