【问题标题】:Jasmine test with httpBackend doesn't return expected result使用 httpBackend 进行 Jasmine 测试未返回预期结果
【发布时间】:2014-04-04 23:34:12
【问题描述】:

我的 $resource-wrapping 服务有一个非常简单的单元测试。我已经模拟并设置了 httpBackend 以返回包含七个项目的数组。当我运行测试时,它报告返回了 4 个项目,而不是 7 个:

函数 (a1, a2, a3, a4) { ... }

预计 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);
 });

});

【问题讨论】:

  • 在预期结果之前使用 httpBackend.expectGET().respond() 而不是 .when()... 和 .flush()
  • 为什么httpBackend.flush(); 被评论和expect(result.length).toBe(4);。我猜是 7 当你收到错误时。
  • 我试过你的推荐;与以前相同的错误加上这个:{错误:不满意的请求:在/Users/phaggood/Desktop/Dropbox/Project/Current/Incubator/mobileapps/dreamfactory/teamsport/test/js/angular-mocks.js中获取/rest/api(第 1488 行)} 取消注释 flush() 得到“错误:没有挂起的刷新请求!”

标签: angularjs jasmine httpbackend


【解决方案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);
});

【讨论】:

  • 错误:意外请求:GET /rest/api 预期 /rest/api/未定义
  • 它似乎只有在我从工厂中删除 {id: 'id'} 时才有效,但现在我失去了使用 Ledgers 进行查询和获取单个实例的能力 - Ledgers.allLedgers() 和Ledgers.get(someId)
  • 所有测试现在都在工作,请参阅上面的修复 - 我不得不稍微修改刘的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2010-09-22
  • 2021-05-17
  • 2018-02-19
相关资源
最近更新 更多