2013-09-10 2 views
10

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

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

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 < - Входы'.

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

Спасибо!

ответ

21

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

Кроме того, достаточно инициализировать макет службы с помощью 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..... 

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

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 

Итак, вы идете. Надеюсь, это полезно для тех, кто ищет «Инъекции насмешек в угловые службы».

+0

Большое вам спасибо за это! Вот еще один пример тестирования службы, контроллера и фильтра с использованием заглушки для обслуживания. https://gist.github.com/clouddueling/11188718 –

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