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
_を追加したら、すべてが良かったです:)
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();
_
私はあなたたちと同じ問題を抱えていました。私の解決策は、.expectGETのURLパラメーターの先頭に「/」を追加することでした。あなたの例を使用して:
$httpBackend.expectGET("/internalapi/quotes").respond({ hello: 'world'})
幸運を祈ります