Тест Jasmine с httpBackend не возвращает ожидаемого результата

У меня есть очень простой модульный тест для моего сервиса $resource-wrapping. Я издевался над httpBackend и настроил его на возврат массива из семи элементов. Когда я запускаю тест, он сообщает, что было возвращено 4 элемента, а не 7:

функция (а1, а2, а3, а4) { ... }

Ожидал, что 4 будет 7.

Ниже мой сервис и моя спецификация

=== обслуживание ===

/* original 
angular.module('TeamSportApp')
.factory('LedgerService', function ($resource) {
    var Ledgers =  $resource("/rest/api", { id: '@id'},
        {
            allLedgers : { method: 'GET', isArray: true},
            postTransaction : { method: 'POST'},
            removeTransaction : { method: 'DELETE'}
        });
    return Ledgers;
})*/

/* Fixed */
    .factory('LedgerService', function ($resource) {
    var Ledgers =  $resource("/rest/api/:id", { id: '@id' },
        {
            allLedgers : { method: 'GET', isArray: true},
            postTransaction : { method: 'POST'},
            removeTransaction : { method: 'DELETE'}
        });
    return Ledgers;
})

})

=== спец ===

 var ledgerArray = [
 {id:1, name:"Master Ledger"},
 {id:2, name:"User1 Ledger"},
 {id:3, name:"User2 Ledger"},
 {id:4, name:"User3 Ledger"},
 {id:5, name:"User4 Ledger"},
 {id:6, name:"User5 Ledger"},
 {id:7, name:"User6 Ledger"}
 ];
 ddescribe('Ledger service test', function(){
 var ledgers, httpBackend;
 beforeEach(module('TeamSportApp','ngResource'));

 beforeEach(inject(function ($injector) {
     ledgers = $injector.get("LedgerService");
     httpBackend = $injector.get("$httpBackend");
 }));

 afterEach (function () {
     httpBackend.verifyNoOutstandingExpectation ();
     httpBackend.verifyNoOutstandingRequest ();
 });

 /* ORIGINAL ERROR 
 it('gets a list of ledgers', function() {
     httpBackend.when('/rest/api').respond(ledgerArray);
     var result = ledgers.allLedgers;
     console.log(result);
     expect(result.length).toBe(4);
     //httpBackend.flush();
 });*/

 /* All fixed using angular1.2.14 per [this][1] */
     it('gets a list of ledgers', function() {
     httpBackend.expectGET('/rest/api').respond(ledgerArray);
     var result = ledgers.allLedgers();
     httpBackend.flush();
     expect(result.length).toBe(7);
 });

 it('gets a single ledger', function() {
     httpBackend.expectGET('/rest/api/2').respond(singleLedger);
     var result = ledgers.get({id:2});
     httpBackend.flush();
     console.log(result);
     expect(result.name).toBe(singleLedger.name);
 });

});


person Patrick Haggood    schedule 04.04.2014    source источник
comment
используйте httpBackend.expectGET().respond() вместо .when()... и .flush() перед ожидаемым результатом   -  person doodeec    schedule 04.04.2014
comment
Почему httpBackend.flush(); комментируется, а expect(result.length).toBe(4);. Я думаю, это было 7, когда вы получили ошибку.   -  person glepretre    schedule 04.04.2014
comment
Я попробовал вашу рекомендацию; та же ошибка, что и раньше, плюс это: {Ошибка: неудовлетворенные запросы: GET /rest/api в /Users/phaggood/Desktop/Dropbox/Project/Current/Incubator/mobileapps/dreamfactory/teamsport/test/js/angular-mocks.js ( строка 1488) } При раскомментировании функции flush() возникает ошибка: нет ожидающих запросов на сброс!   -  person Patrick Haggood    schedule 04.04.2014


Ответы (1)


Попробуй это:

Сервис:

.factory('LedgerService', function ($resource) {
    var Ledgers =  $resource("/rest/api/:id", { id: '@id'},
        {
            allLedgers : { method: 'GET', isArray: true},
            postTransaction : { method: 'POST'},
            removeTransaction : { method: 'DELETE'}
        });
    return Ledgers;
});

Тест:

it('gets a list of ledgers', function() {
    httpBackend.expect('/rest/api/').respond(ledgerArray);
    var result = ledgers.allLedgers();
    httpBackend.flush();
    expect(result.length).toBe(7);
});
person Ye Liu    schedule 04.04.2014
comment
Ошибка: Неожиданный запрос: GET /rest/api Expected /rest/api/ undefined - person Patrick Haggood; 04.04.2014
comment
Кажется, это работает, только если я удалю {id: 'id'} из фабрики, хотя теперь я теряю возможность использовать Ledgers для запроса и получения одного экземпляра - Ledgers.allLedgers() и Ledgers.get(someId) - person Patrick Haggood; 04.04.2014
comment
Все тесты теперь работают, см. исправления выше - мне пришлось немного изменить ответ Лю. - person Patrick Haggood; 04.04.2014