2013-08-09 44 views
52

tôi đã xác định các dịch vụ sau đây trong ứng dụng góc của tôi:Tại sao tôi nhận được lỗi ... theo yêu cầu đột xuất: GET/internalapi/dấu ngoặc kép

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

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

và tôi đang viết spec sau để kiểm tra nó:

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(); 
    }); 

}); 

Bất cứ khi nào tôi chạy các bài kiểm tra, thử nghiệm đầu tiên trôi qua nhưng các thử nghiệm thứ hai tạo ra lỗi:

Error: Unexpected request: GET /internalapi/quotes

Tôi đang làm gì sai?

EDIT:

Hóa ra tôi đã cấu hình Restangular như vậy ... RestangularProvider.setBaseUrl("/internalapi");. Nhưng tôi đã giả mạo các cuộc gọi đến internalapi/quotes. Chú ý sự thiếu "/". Khi tôi đã thêm dấu gạch chéo /internalapi/quotes tất cả đều tốt :)

+1

http://stackoverflow.com/questions/14761045/jasmine-tests-angularjs-directives-with-templateurl (tôi không cờ như trùng lặp, vì các vấn đề có vẻ khác nhau ở mức độ nào đó). –

+1

Hãy nhớ đánh dấu câu hỏi của bạn là đã được giải quyết, dựa trên chỉnh sửa của bạn có vẻ như nó đã được sửa. :) –

+0

Có thể rõ ràng với người khác, nhưng trong trường hợp không, các cuộc gọi 'expectMETHOD' này mong bạn chuyển vào URL đầy đủ, không chỉ đường dẫn, nếu bạn đang gọi các dịch vụ bên ngoài. – kungphu

Trả lời

54

Bạn cần phải thông báo $ httpBackend để mong đợi yêu cầu 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", 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(); 
    })); 

}); 

Hoặc bạn có thể đặt respond() trên expectGET(). Tôi thích đặt câu lệnh whenGET() của mình theo cách beforeEach() theo cách đó tôi không phải xác định phản hồi trong mọi thử nghiệm.

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

     ms.retrieveQuotes(); 
     $httpBackend.flush(); 
+3

Thật không may, ngay cả khi tôi thêm '' '$ httpBackend.expectGET (" internalapi/quotes ");' '' , Tôi nhận được lỗi tương tự. Bất kỳ ý tưởng nào khác? –

+0

Điều đó sẽ hoạt động. Chỉ cần đoán nhưng hãy thử tiêm '$ httpBackend' trực tiếp vào bài kiểm tra của bạn. Tôi sẽ cập nhật bài đăng để hiển thị điều này. –

+0

Không, điều tương tự. Tôi đã xem xét rất nhiều ví dụ và tôi đồng ý, tôi dường như đang làm điều đó một cách chính xác, nhưng không có gì đáng tiếc. –

17

Tôi gặp vấn đề tương tự như các bạn. Giải pháp của tôi là thêm '/' vào đầu tham số URL của .expectGET. Sử dụng ví dụ của bạn:

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

Best of luck

Các vấn đề liên quan