0

AngularJS アプリケーションのサービス用に作成された次の非常に単純なテストがあります。

describe('Services', function () { 

    beforeEach(function(){
        this.addMatchers({
            toEqualData: function(expected) { 
                return angular.equals(this.actual, expected);
            }
        });
    });

    beforeEach(module('myapp.services'));

    describe('Album service', function(){
        var Album;

        beforeEach(inject(function (_Album_) { 
            Album = _Album_;
        }));

        it('can get an instance of the Album factory', inject(function (Album) { 
            expect(Album).toBeDefined();
        }));
    });
});

AngularJS documentation でアドバイスされているように、カスタム toEqualData マッチャーを追加しました。ただし、これはテストを中断します。Gulp を使用してテストを実行していますgulp-karma(ただし、Karma を直接使用すると同じ問題が発生します)。次のエラー メッセージが表示されます。

$ gulp test
[10:00:04] Using gulpfile ~/Projects/myapp/gulpfile.js
[10:00:04] Starting 'jshint'...
[10:00:04] Starting 'karma'...
WARN `start` method is deprecated since 0.13. It will be removed in 0.14. Please use
  server = new Server(config, [done])
  server.start()
instead.
31 07 2015 10:00:04.362:INFO [karma]: Karma v0.13.3 server started at http://localhost:9876/
31 07 2015 10:00:04.368:INFO [launcher]: Starting browser PhantomJS
[10:00:04] Finished 'jshint' after 277 ms
31 07 2015 10:00:04.631:INFO [PhantomJS 1.9.8 (Linux 0.0.0)]: Connected on socket sFxRfQ6bJtqM_utNAAAA with id 27252937
PhantomJS 1.9.8 (Linux 0.0.0) Services Album service can get an instance of the Album factory FAILED
        TypeError: 'undefined' is not a function (evaluating 'this.addMatchers')
            at /home/matthew/Projects/myapp/tests/services.tests.js:7
PhantomJS 1.9.8 (Linux 0.0.0): Executed 7 of 7 (1 FAILED) (0.04 secs / 0.022 secs)
[10:00:04] Finished 'karma' after 558 ms
[10:00:04] Starting 'test'...
[10:00:04] Finished 'test' after 11 μs

どこを間違えたのか見えない。何か案は?実際にはまだ使用していませんが、使用する予定のカスタムマッチャーを取り出すと、実際には問題なく動作します。マッチャーが原因のようですが、文字通りAngularのドキュメントからコピーして貼り付けているため、なぜ機能しないのか途方に暮れています。

4

2 に答える 2

9

最後に問題を解決しました。Jasmine API が 1.3 と 2.0 の間で変更されており、AngularJS のドキュメントにはこれに関する情報がないようです。これで問題を解決した方法は次のとおりです。うまくいけば、これで立ち往生している他の人が実用的な解決策を見つけることができます。

describe('Services', function () { 

    beforeEach(function(){
        jasmine.addMatchers({
            toEqualData: function(util, customEqualityTesters) { 
                return { 
                    compare: function(actual, expected) { 
                        return { 
                            pass: angular.equals(actual, expected)
                        };
                    } 
                };
            } 
        });
    });

    beforeEach(module('myapp.services'));

    describe('Album service', function(){
        var Album;

        beforeEach(inject(function (_Album_, _$httpBackend_) { 
            Album = _Album_;
            mockBackend = _$httpBackend_;
        }));

        it('can get an instance of the Album factory', inject(function (Album) { 
            mockBackend.expectGET('https://myapp.com/api/albums').respond([{id: 1}, {id: 2}]);
            expect(Album).toBeDefined();
            var albums = Album.query();
            mockBackend.flush();
            expect(albums).toEqualData([{id: 1}, {id: 2}]);
        }));
    });
});

基本的には、マッチャーを追加するときにthisforを変更し、とを引数として関数に渡し、 ではなくそれらを使用するだけです。現在、期待どおりに動作しているようです。jasmineactualexpectedthis

編集:うまくいかなかったことが判明しました。黙って失敗しただけです。今、修正しました。

于 2015-07-31T10:27:47.007 に答える