我在我的角度应用程序中定义了以下服务:
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(); }); });
每当我运行测试时,第一个测试通过,但第二个测试产生错误:
错误:意外请求:GET / internalapi / quotes
我究竟做错了什么?
编辑:
原来我配置Restangular像这样… RestangularProvider.setBaseUrl(“/ internalapi”);.但我是伪造调用internalapi / quotes。注意缺少“/”。一旦我添加了斜杠/ internalapi / quotes都是好:)
你需要告诉$ httpBackend期望一个GET请求。
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",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();