2

私は 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 モック v1.2.21

4

1 に答える 1

0

Report.query() を実際に発行している場所がわかりません。getBook 関数は、関数内に非同期のものがないため、決して解決されない未解決の promise を返すだけです。

.then() (book 関数内) で解決された promise を使用して book 関数を介して Report.query を呼び出す必要があります。その後、service.getBook().then() で http バックエンドをフラッシュし、expect を実行します。

于 2014-08-19T18:30:09.090 に答える