2

我是 AngularJs 的新手,我正在编写我的第一个单元测试;为了测试服务,我编写了一个简单地返回单个 Json 对象的测试。但是,每次我运行测试时,都会收到标题中所述的错误。我不知道究竟是什么原因造成的!我尝试继续阅读$apply$digest但不确定我的情况是否需要,如果需要,如何;一个简单的 plunker 演示将不胜感激。

这是我的代码

服务

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

4

1 回答 1

0

I don't see where you're actually issuing a Report.query(). The getBook function just returns an unresolved promise that will never be resolved because nothing in the function is async.

You need to call Report.query via the book function with the promise resolved in the .then() (in the book function). After that, flush the http backend in the service.getBook().then() and do the expect.

于 2014-08-19T18:30:09.090 回答