Вместо использования createSpyObj вы можете просто использовать spyOn.Как в:
beforeEach(
inject(function(
_catalogService_,
_$rootScope_,
_$httpBackend_,
_metricsService_ //get the dependecy from the injector & then spy on it's properties
) {
catalogService = _catalogService_;
metricsService = _metricsService_;
$scope = _$rootScope_.$new();
...
// create the spy object for easy referral later on
someMethodSpy = jasmine.spyOn(metricsService, "someMethodIWannaSpyOn")
})
);
describe('get catalog', function(){
it("Should get catalogs", function(done) {
catalogService.normalizedDynamicAppList = testDynamicAppList1;
catalogService.response = null;
var promise3 = catalogService.getCatalog();
...other expects
...
//do the spy-related expectations on the function spy object
$httpBackend.flush(); // this causes the $http.get() to "move forward"
// and execution moves into the .then callback of the request.
expect(someMethodSpy).toHaveBeenCalled();
});
});
Я использовал этот шаблон при тестировании сложных угловых приложений, а также оборачивал внешние импортированные / глобальные зависимости в угловые сервисные оболочки, чтобы позволить шпионить и издеваться над ними для тестирования.
Причина, по которой createSpyObject не сработает, заключается в том, что при его использовании будет создан совершенно новый объект metricService с указанными шпионскими реквизитами.Это не будет тот же «metricService», который вводится в сервис, проверяемый угловым инжектором.Вы хотите получить тот же сервисный объект-одиночка из инжектора, а затем шпионить за его свойствами.
Другим источником дисфункции было местоположение $httpBackend.flush()
s.$httpBackend
- это макет для службы $ http: вы заранее определяете любое количество ожидаемых HTTP-запросов, которые будут сделаны кодом, который вы тестируете.Затем, когда вы вызываете функцию, которая внутренне использует $ http для запроса некоторого URL-адреса, вместо этого $ httpBackend перехватывает вызов метода $ http (и может выполнять такие действия, как проверка полезной нагрузки и заголовков запроса и ответ).Обработчики then / error для вызова $http
называются только после , тестовый код вызывает $httpBackend.flush()
.Это позволяет вам выполнять любые настройки, необходимые для подготовки некоторого состояния теста, и только затем запускать обработчик .then
и продолжать выполнение асинхронной логики.
Лично для меня то же самое происходит каждый раз, когда я пишу тесты с $ httpBackend, и всегда требуется время, чтобы выяснить или запомнить :)