web-dev-qa-db-ja.com

エラーが発生する理由...予期しないリクエスト:GET / internalapi / quotes

angular appで次のサービスを定義しました。

_services.factory('MyService', ['Restangular', function (Restangular) {
       return {
           events : { loading : true },

           retrieveQuotes : function() {
               return Restangular.all('quotes').getList().then(function() {
                   return { hello: 'World' };
               });
           }
    };
}]);
_

そして、私はそれをテストするために次の仕様を書いています:

_describe("MyService", function () {

    beforeEach(module('MyApp'));
    beforeEach(module("restangular"));

    var $httpBackend, Restangular, ms;

    beforeEach(inject(function (_$httpBackend_, _Restangular_, MyService) {
        ms = MyService;
        $httpBackend = _$httpBackend_;
        Restangular = _Restangular_;
    }));


    it("retrieveQuotes should be defined", function () {
        expect(ms.retrieveQuotes).toBeDefined();
    });

    it("retrieveQuotes should return array of quotes", function () {

        $httpBackend.whenGET("internalapi/quotes").respond({ hello: 'World' });
        ms.retrieveQuotes();
        $httpBackend.flush();
    });

});
_

テストを実行するたびに、最初のテストはパスしますが、2番目のテストはエラーを生成します:

_Error: Unexpected request: GET /internalapi/quotes_

何が間違っていますか?

編集:

Restangularのように構成したことが判明しました... RestangularProvider.setBaseUrl("/internalapi");。しかし、私は_internalapi/quotes_の呼び出しを偽造していました。 「/」がないことに注意してください。スラッシュ_/internalapi/quotes_を追加したら、すべてが良かったです:)

55
Simon Lomax

GETリクエストを期待するように$ httpBackendに指示する必要があります。

_describe("MyService", function () {

   beforeEach(module('MyApp'));
   beforeEach(module("restangular"));

   var Restangular, ms;

    beforeEach(inject(function (_Restangular_, MyService) {
        ms = MyService;

        Restangular = _Restangular_;
    }));


    it("retrieveQuotes should be defined", function () {
        expect(ms.retrieveQuotes).toBeDefined();
    });

    it("retrieveQuotes should return array of quotes", inject(function ($httpBackend) {

        $httpBackend.whenGET("internalapi/quotes").respond({ hello: 'World' });

        //expect a get request to "internalapi/quotes"
        $httpBackend.expectGET("internalapi/quotes");

        ms.retrieveQuotes();
        $httpBackend.flush();
    }));

});
_

または、respond()expectGET()に置くこともできます。私はwhenGET()ステートメントをbeforeEach()に入れて、すべてのテスト内で応答を定義する必要がないようにします。

_        //expect a get request to "internalapi/quotes"
        $httpBackend.expectGET("internalapi/quotes").respond({ hello: 'World' });

        ms.retrieveQuotes();
        $httpBackend.flush(); 
_
56

私はあなたたちと同じ問題を抱えていました。私の解決策は、.expectGETのURLパラメーターの先頭に「/」を追加することでした。あなたの例を使用して:

$httpBackend.expectGET("/internalapi/quotes").respond({ hello: 'world'})

幸運を祈ります

17
gronnbeck