0

promise オブジェクトからデータを取得するコントローラーがあります。

コントローラーは次のようになります。

MyApp.controller("BookListController", ["$scope", "BookListModel","LibraryService", function($scope, BookListModel, LibraryService) {
    LibraryService.getLibraryData().then(function(result) {
        $scope.books = BookListModel.createBookList(result.bookList.data, result.authorList.data, result.publisherList.data);
    });
}]);

これは、REST サービスからデータを取得する私の工場です。

MyApp.factory("LibraryService", function($http, $q) {
    var service = {};
    var libraryDataPromise = $q.defer();

    $q.all({
        books : $http.get("http://localhost:8080/library/service/books"),
        authors : $http.get("http://localhost:8080/library/service/authors"),
        publishers : $http.get("http://localhost:8080/library/service/publishers")
    }).then(function(response) {
        libraryDataPromise.resolve({
            bookList : response.books,
            authorList : response.authors,
            publisherList : response.publishers
        });
    });

    service.getLibraryData = function() {
        return libraryDataPromise.promise;
    }

    return service;
});

わかりました、それだけです。今度は、私が誰を書いたかをテストに示します。

describe("Book_App Controllers", function() {

describe("BookListController Test", function() {
    var BookListModelMock, LibraryServiceMock, scope = {}, controller
        ,deferred, promise;

    beforeEach(function() {
        module("MyApp");
        BookListModelMock = new function() {
            this.createBookList = function(a, b, c) {
                return [{},{},{}];
            };
        };
    });

    beforeEach(inject(function($rootScope, $controller ) {
        scope = $rootScope.$new();
        controller = $controller("BookListController",
            {$scope : scope, BookListModel : BookListModelMock});
    }));

    beforeEach(inject(function($q) {
        deferred = $q.defer();
        promise = deferred.promise;
        deferred.resolve([
            { data : [{}, {}, {}]}
        ])

        LibraryServiceMock = function() {
            var service = {};

            service.getLibraryData = function() {
                return promise;
            }
        };
    }));

    it("should contains three books", inject(function($rootScope) {
        $rootScope.$apply();
        expect(scope.books.length).toBe(3);
    }));
});

});

テストを実行すると、ジャスミンがスローします: エラー: 予期しない要求: GET http://localhost:8080/library/service/books No more request expected

この問題の意味はわかっていますが、何が解決するのかわかりません。$http をモックする必要がありますか? promise と defer をテストする方法を読みましたが、チュートリアルでは $q 操作を含む関数をテストする方法について説明し、$q 操作を含む関数に依存する関数をテストする方法については説明しません。

4

1 に答える 1

1

LibraryServiceMock は使用されていません。コントローラーを作成する前にモックを作成し、BookListModelMock を新しいコントローラーに提供するのと同じ方法で使用する必要があります。

LibraryService テストを作成する場合、$httpBackend.expect() を使用してリクエストをモックできます: https://docs.angularjs.org/api/ngMock/service/ $httpBackend

于 2015-03-05T21:30:36.463 に答える