2015-11-23 4 views
5

Я пытаюсь выполнить тестирование моего приложения AngularJS, используя Karma and Jasmine. Я хочу высмеять услугу $ http. Для этого я использую метод $ httpBackend. Ниже моя служба, что я хочу, чтобы проверить:

angular.module('MyModule').factory('MyService', function($http, $log, $parse, $q, $timeout, $filter, MyOtherService1, MyOtherService2){ 
var service = {}; 
    service.getSomething = function(id){ 
    return $http.get('/somePath/subpath/' + id); 
    } 
}); 

Мой модульное тестирование данной услуги:

describe("myTest", function(){ 
    var myService, $httpBackend, scope, mockMyOtherService1, mockMyOtherService2; 

    var myResponse = 
    { 
     foo:'bar' 
    }; 

    beforeEach(module("MyModule")); 

    beforeEach(inject(function(_MyService_, $injector){ 

     $httpBackend = $injector.get('$httpBackend'); 
     myService = _MyService_; 
     scope = $injector.get('$rootScope').$new(); 
     mockMyOtherService1 = $injector.get('MyOtherService1'); 
     mockMyOtherService2 = $injector.get('MyOtherService2'); 

    })); 

    beforeEach(function(){ 
     //To bypass dependent requests 
     $httpBackend.whenGET(/\.html$/).respond(200,''); 
    }); 

    //If I uncomment the below afterEach block, the same error is shown at next line. 
    /*afterEach(function() { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    });*/ 

    //This test passes successfully 
    it("should check if service is instantiated", function() { 
     expect(myService).toBeDefined(); 
    }); 

    //This test passes successfully 
    it("should expect dependencies to be instantiated", function(){ 
     expect($httpBackend).toBeDefined(); 
    }); 

    //The problem is in this test 
    it("should get the getSomething with the provided ID", function() { 
     $httpBackend.whenGET('/somePath/subpath/my_123').respond(200,myResponse);    
     var deferredResponse = myService.getSomething('my_123'); 

     //The error is shown in next line. 
     $httpBackend.flush();  

     //If I comment the $httpBackend.flush(), in the next line, the $$state in deferredResponse shows that the Object that I responded with is not set i.e. it does not matches the 'myResponse'. 
     expect(deferredResponse).toEqual(myResponse); 

    }); 
}); 

Это чрезвычайная проблема и мне нужна помощь в отношении такой же, как можно скорее. Я буду очень благодарен за ваш ответ.

ответ

1

Проблема заключалась в том что мне нужно, чтобы ввести $ местоположение в моих файлах спецификации, даже если они не вводят в услугах. После инъекции все работало хорошо! Надеюсь, это поможет кому-то, кто застрял в той же ситуации.

+1

Это не сработало для меня: P –

+0

@TusharRaj В чем проблема, с которой вы столкнулись? Пожалуйста, укажите мне свой вопрос в stackoverflow – Jagrut

1

Вы получите обещание от вашего обслуживания. Таким образом изменить тестовый код:

//The problem is in this test 
it("should get the getSomething with the provided ID", function (done) { 
    $httpBackend.expectGET('/somePath/subpath/my_123').respond(200,myResponse); 
    var deferredResponse = myService.getSomething('my_123'); 

    deferredResponse.then(function (value) { 
    expect(value.data).toEqual(myResponse); 
    }).finally(done); 

    $httpBackend.flush(); 
}); 
+0

Я пробовал ваш код, но он дает ту же ошибку, потому что ошибка находится в строке $ httpBackend.flush(). Он не выполняется после этой строки. Если я прокомментирую строку $ httpBackend.flush(), она будет работать. Но мне нужен блок $ httpBackend.flush() и afterEach(). – Jagrut

+0

Я обновил ответ, переместил вызов flush() до конца. Теперь он работает на моей машине. Можете ли вы попробовать снова с обновленным кодом? – ogugger

+0

По-прежнему такая же ошибка! Я думаю, что я что-то не замечаю, но я не могу это выяснить. Даже если я не пишу никакого блока(), afterEach() должен работать, но он также не работает! Поэтому мне пришлось прокомментировать это и продолжить. Но даже тогда я застрял в $ httpBackend.flush()! – Jagrut

1

У меня была эта проблема при обновлении проекта с Angular 1.2 до 1.4. Код проверки выглядел примерно так:

it('should call /something', function(){ 
    httpBackend.expectGET('/something').respond(200); 
    scope.doSomething(); 
    httpBackend.flush(); 
}); 

Ошибка была в infdig за последние 10 итераций. Это было вызвано вызовом метода .flush(). Я понял, что это похоже, потому что не было ожидающих обещаний, созданных в пределах doSomething().

Как только я добавил обещание где-то в пределах doSomething() или внутренних методах, проблема infdig исчезла.

Я подозреваю, что это 100% -ная спекуляция, поэтому не позволяйте ей влиять на вашу разработку - это потому, что httpBackend делает некоторые обманные действия, чтобы ждать обещаний, которые, возможно, связаны с перевариванием, пока не произойдут изменения. Поскольку никаких обещаний нет, нет никаких изменений - бесконечный дайджест.