2013-08-11 25 views
11

Tôi muốn chuyển một số yêu cầu http của mình thông qua và không thử chúng trong thử nghiệm đơn vị của tôi, nhưng khi tôi cố gắng gọi phương thức passThrough(), lỗi của phương thức bị thiếu được ném:

"TypeError: Object # has no method 'passThrough'".

Có ai biết cách khắc phục không?

Có mã của tôi:

'use strict'; 

describe('Controller: MainCtrl', function() { 

    // load the controller's module 
    beforeEach(module('w00App')); 

    var scope, MainCtrl, $httpBackend; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { 
     $httpBackend = _$httpBackend_; 
     $httpBackend.expectGET('http://api.some.com/testdata.json').passThrough(); 


     scope = $rootScope.$new(); 
     MainCtrl = $controller('MainCtrl', { 
      $scope: scope 
     }); 
    })); 
}); 
+3

Như đã giải thích trong [tài liệu] (http://docs.angularjs.org/api/ngMock.$httpBackend): * Trong quá trình kiểm tra đơn vị, chúng tôi muốn thử nghiệm đơn vị của mình chạy nhanh và không có phụ thuộc bên ngoài vì vậy chúng tôi không muốn gửi yêu cầu XHR hoặc JSONP tới máy chủ thực *. Dịch vụ $ httpBackend được sử dụng trong các bài kiểm tra đơn vị không thể đi qua. Tuy nhiên, $ httpBackend được sử dụng bởi kiểm thử end-to-end có thể. –

+6

Điều này làm cho các chỉ thị thử nghiệm với các mẫu bên ngoài khó khăn hơn cần thiết, bạn có nghĩ vậy không? – SimplGy

Trả lời

4

Nếu bạn muốn thử phụ trợ của bạn trong phát triển, chỉ cần cài đặt angular-mocks trong file html chính của bạn, thêm nó như một sự phụ thuộc vào ứng dụng của bạn (angular.module('myApp', ['ngMockE2E'])) và sau đó thử các yêu cầu bạn cần phải.

Ví dụ;

angular.module('myApp') 
    .controller('MainCtrl', function ($scope, $httpBackend, $http) { 
    $httpBackend.whenGET('test').respond(200, {message: "Hello world"}); 
    $http.get('test').then(function(response){ 
     $scope.message = response.message //Hello world 
    }) 
    }); 

Hãy cảnh giác rằng việc thêm ngMockE2E sẽ yêu cầu bạn thiết lập tuyến đường trong trường hợp bạn thực hiện điều đó thông qua định tuyến AngularJS.

Ví dụ;

angular.module('myApp', ['ngMockE2E']) 
    .config(function ($routeProvider) { 
    $routeProvider 
     .when('/', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 
    }) 
    .run(function($httpBackend){ 
    $httpBackend.whenGET('views/main.html').passThrough(); 
    }) 
+11

Bạn không nên thêm các mock góc làm phụ thuộc vào ứng dụng của bạn, nhưng sử dụng nó trong karma.conf của bạn. Sau đó, trên beforeEach (module (...)) vượt qua trong 'ngMockE2E'. – gonzofish

+4

+1 gonzofish. Chỉ cần thêm beforeEach (function() {module ('ngMockE2E');}); trong thử nghiệm của bạn. Không cần phải gây ô nhiễm cho ứng dụng của bạn bằng các bài kiểm tra. – benek

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