jasmine使用時、$httpBackendのrespondで応答を設定できない

投稿者: Anonymous

以下のコードはAngular.jsのサービスとkarma+jasmineでテストするためのテストのペアを想定しています。
myService.get()が意図した値を返すかテストしています。
この時、$httpBackendを使ってサーバーが特定の値(この場合’hello’)を返したいのですが、
expect(data).toBe('hello');を通らず全てパスしてしまいます。
また失敗時にconsole.error(err)で出力されるはずのログも出力されていません。

実際にアプリを立ち上げてみるとmyServiceは意図した通りに動作しているため、$httpBackendの設定の仕方がおかしいのかと推測しています。

原因の見当がつく方、ご教授ください。


サービス

angular.module('historyCompositionApp')
    .service('myService', ['$http', '$q', function($http, $q) {
        this.get = function() {
            var d = $q.defer();
            $http({
                    method: 'GET',
                    url: 'testData.json'
                })
                .success(function(data) {
                    //応答データ変換処理が入る

                    d.resolve(data);
                })
                .error(function(err) {
                    d.reject(err);
                });
            return d.promise;
        };
    }]);

テスト

describe('Service: myService', function() {

    var $httpBackend;

    // load the service's module
    beforeEach(module('myApp'));

    // instantiate service
    var myService;
    beforeEach(inject(function(_myService_, _$httpBackend_) {
        myService = _myService_;
        $httpBackend = _$httpBackend_;
    }));

    it('should say hello', function() {
        $httpBackend.expect('GET', 'testData.json').respond('hello');
        var promise = myService.get()
    promise.then(function(data) {
            console.log(data);
            expect(data).toBe('hello');
        }, function(err) {
            console.error(err)
        });
    });
});

解決

$httpBackendのレスポンスを受け取るには明示的にflush()メソッドを呼ぶ必要があります。テストの最後に$httpBackend.flush()の1文を加えてみてください。

it('should say hello', function() {
    $httpBackend.expect('GET', 'testData.json').respond('hello');
    var promise = myService.get()
promise.then(function(data) {
        console.log(data);
        expect(data).toBe('hello');
    }, function(err) {
        console.error(err)
    });
    $httpBackend.flush();
});
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *