19716


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

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

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

* * *

サービス

[code]

    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;
            };
        }]);
    
[/code]

* * *

テスト

[code]

    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)
            });
        });
    });
    
[/code]


CC BY-SA 3.0
2015-12-07T11:32:02.990
19712
2016-11-06T16:04:51.830
2016-11-06T16:04:51.830
754
13045
question
javascript angularjs jasmine
jasmine使用時、$httpBackendのrespondで応答を設定できない


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

[code]

    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();
    });
    
[/code]


CC BY-SA 3.0
2015-12-07T11:57:20.963
19716
2015-12-07T11:57:20.963
8532
19712
answer