错误:单元测试AngularJs服务时,没有待处理的flush请求

Error: No pending request to flush - when unit testing AngularJs service

本文关键字:处理 请求 flush 单元测试 AngularJs 服务 错误      更新时间:2023-09-26

我是AngularJs的新手,我正在编写我的第一个单元测试;为了测试服务,我编写了一个只返回单个Json对象的测试。然而,每次我运行测试时,我都会得到标题中所述的错误。我不知道到底是什么引起的!我试着阅读$apply$digest,不确定在我的情况下是否需要,如果是,如何;一个简单的柱塞演示将不胜感激。

这是我的代码

服务
var allBookss = [];
var filteredBooks = [];
/*Here we define our book model and REST api.*/
var Report = $resource('api/books/:id', {
     id: '@id'
}, {
     query: {
            method: 'GET',
            isArray: false
     }
});
/*Retrive the requested book from the internal book list.*/
var getBook = function(bookId) {
      var deferred = $q.defer();
       if (bookId === undefined) {
           deferred.reject('Error');
       } else {
           var books= $filter('filter')(allBooks, function(book) {
              return (book.id == bookId);
           });
           if (books.length > 0) {
                deferred.resolve(books[0]);//returns a single book object
            } else {
                deferred.reject('Error');
            };
         };
 return deferred.promise;
}; 

测试
describe('unit:bookService', function(){
beforeEach(module('myApp'));
var service, $httpBackend;
beforeEach(inject(function (_bookService_, _$httpBackend_) {
    service = _bookService_;
    $httpBackend = _$httpBackend_;
    $httpBackend.when('GET', "/api/books/1").respond(200, {
        "book": {
            "id": "1",
            "author": "James Spencer",
            "edition": "2",
            .....
        }
    });
}));
afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});
it('should return metadata for single report', function() {
      service.getBook('1').then(function(response) {
               expect(response.length).toEqual(1);
           });
    $httpBackend.flush();// error is in this line
});
});

错误
Error: No pending request to flush !
    at c:/myapp/bower_components/angular-mocks/angular-mocks.js:1439
    at c:/myapptest/tests/bookTest.js:34

libs version

AngularJS v1.2.21

AngularJS-mock v1.2.21

我不知道您实际上在哪里发出Report.query()。getBook函数只返回一个无法解析的承诺,这个承诺永远不会被解析,因为函数中没有任何内容是异步的。

你需要呼叫Report。使用.then()(在book函数中)解析的承诺通过book函数进行查询。之后,在service.getBook().then()中刷新http后端并执行预期操作。