2013-12-04 2 views
7

Скажем, у меня есть служба, как это, когда автомобиль получает услугу двигателя впрыскивается, который является функцией конструктора:Тестирование впрыскивается службы, которая является функцией конструктора

angular.module('car', ['engine']).factory('carCreator', function(engine) { 

    var carCreator = function(settings) { 

     var engineInstance = engine(settings); 
     engineInstance.setMiles(settings.engine.miles); 

     return { 
      brand: settings.brand; 
      engine: engineInstance; 
     } 
    }; 

    return carCreator; 
}); 

Как проверить обе линии в инициализации логика:

var engineInstance = engine(settings); 
engineInstance.setMiles(settings.engine.miles) 

1: Это engine вызывается с settings

2: Это engineInstance.setMiles вызывается с settings.engine.miles

Это то, что я делаю прямо сейчас, но не повезло:

describe('initialization', function() { 

    var carCreator; 
    var settings = { 
     brand: 'Ford', 
     engine: { 
      miles: 12000 
     } 
    }; 

    var mockEngineInstance = { 
     setMiles: function() {} 
    }; 

    window.mockEngineCreator = function() { 
     return mockEngineInstance; 
    } 

    beforeEach(module('car', function($provide) { 
     $provide.value('engine', mockEngineCreator); 
    })); 

    beforeEach(inject(function(_carCreator_) { 
     carCreator = _carCreator_; 
    })); 

    it('should init text object correctly on initialization', function() { 

     spyOn(window, 'monkEngineCreator'); 
     spyOn(mockEngineInstance, 'setMiles'); 
     carCreator(settings); 

     expect(window.mockEngineCreator).toHaveBeenCalledWith(settings); 
     expect(mockEngineInstance.setMiles).toHaveBeenCalledWith(settings.engine.miles); 
    }); 
}); 

, но этот тест не удается, говоря, что window.mockEngineCreator никогда не называли. Кажется, что $ обеспечивает создание новой копии переданной функции, вместо того, чтобы ссылаться на нее. Итак, кто-нибудь знает, как настроить тест, который может проверить это правильно?

ответ

7

Причина этого в том, что при запуске spyOn (окно, «monkEngineCreator») шпион помещается в окно, а не впрыснутое значение, которое угловое использует для инъекции зависимостей.

Делать что-то, как это должно работать: (непроверенный код)

beforeEach(module('car', function($provide){ 
    $provide.value('engine', jasmine.createSpy('engineSpy').andCallFake(function(){ 
     return mockEngineInstance; 
    })); 
})); 

it('should init', inject(function(carCreator, engine){ 
    var settings = {}; 
    carCreator(settings); 

    expect(engine).toHaveBeenCalledWith(settings); 
})); 
+0

Большое спасибо, это сделал трюк! Очень приятно :) – acrmuui

+2

Абсолютно роскошный. Если использовать Jasmine 2, не забудьте использовать 'and.callFake' вместо этого. – djskinner

+0

спасибо, я тебя люблю –

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