2013-01-09 41 views
11

Tôi đang cố gắng kiểm tra một bộ điều khiển sử dụng tài nguyên $ của góc.

function PermissionsCtrl($scope, $resource, $cookies) { 
    var Object = $resource('/v1/objects/:id'); 
    loadObjects(); 

    function loadObjects() { 
    $scope.myAppObjects = new Array(); 

    var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'}, 
     function(){ 
     if (data.results) { 
      for(var i = 0; i< data.results.length; i++) { 
      if(!data.results[i].is_deleted) { 
       (function(i){ 
       $scope.objects(data.results[i]); 
       }(i)); 
      } 
      } 
     } 
     }, 
     function(error){console.log(error);}); 
    } 

Và đây là mã thử nghiệm.

var apiServer = "..."; 
var app_id = 999 
var mock_object_data = {...}; 


describe('apps permissionsCtrl', function(){ 
    var scope, ctrl, $httpBackend; 

    // Create a matcher for comparing data 
    beforeEach(function() { 
    this.addMatchers({ 
     toEqualData: function(expected) { 
     return angular.equals(this.actual, expected); 
     } 
    }); 
    }); 

    // Create the controller with injected data/services 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) { 
    $httpBackend = _$httpBackend_; 
    // cookie data to inject 
    var cookies = new Array(); 
    cookies['id'] = '...'; // just needs to be declared 


    $httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id']) 
     .respond(mock_object_data); 

    var $injector = angular.injector(['ng', 'ngResource']); 
    var $resource = $injector.get('$resource'); 

    scope = $rootScope.$new(); 
    ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource}); 
    })); 

    it('should put object data into $scope', function() { 
    $httpBackend.flush(); 
    expect(scope.objects).toEqualData(mock_object_data); 

}); });

Khi tôi chạy này tôi nhận được

Error: Unknown provider: $resourceProvider <- $resource 

tại dòng nơi tôi cố gắng tạo ra bộ điều khiển của tôi. Tôi không hiểu làm thế nào để tiêm này vào bộ điều khiển của tôi và không có vấn đề gì tôi cố gắng tôi nhận được cùng một lỗi. Một vài điều tôi đã thử là

  • Khai báo đối tượng giả trống và chuyển nó qua biến cookie tương tự. Tôi con số này có lẽ là một giải pháp xấu anyway kể từ khi tôi thực sự muốn sử dụng dịch vụ.
  • Bắt chước phạm vi giả lập và chuyển nó vào hàm tiêm của tôi và chuyển $ resource ($ new() vào bộ điều khiển của tôi.
  • Không làm gì và hy vọng rằng httpBackend sẽ bao gồm nó vì đó là những gì cuối cùng được gọi là anyway. Vojta Jína làm cho âm thanh như thế sẽ hoạt động nhưng không có xúc xắc.
  • Biểu tượng nhẹ. Thỏa mãn nhưng không hiệu quả lắm.

Trả lời

6

Sau hơn đọc và nhiều hơn nữa thử nghiệm có vẻ như đúng cách để làm điều này là trừu tượng việc sử dụng các tài nguyên $ ra của bộ điều khiển. Trong trường hợp của tôi, tôi đã viết một dịch vụ dựa trên tài nguyên $ và sau đó tiêm dịch vụ đó vào bộ điều khiển của tôi. Trong khi đó tôi kiểm tra dịch vụ đó một cách riêng biệt với bộ điều khiển của tôi. Thực hành tốt hơn xung quanh.

khai dịch vụ My:

angular.module('apiModule', ['localResource', 'ngCookies']) 
.factory('apiService', function($resource, $cookies) { 

và trong các thử nghiệm đơn vị của tôi, tôi vượt qua nó thông qua trong một chức năng thiết lập beforeEach

beforeEach(module('apiModule')); 
+19

Bạn có thể chia sẻ mẫu mã hoàn chỉnh hơn không? Là một người mới đến với Angular và Jasmine, tôi gặp rắc rối khi quấn đầu mình quanh chuyện này. –

+0

@akronym Vì vậy, bạn đã bao gồm 'app.js' để kiểm tra bộ điều khiển? – Deeptechtons

+10

Nhưng bạn sẽ không gặp phải vấn đề tương tự khi thử nghiệm dịch vụ của mình? –

6

Cố gắng nhanh chóng $resource với đoạn mã sau:

var $injector = angular.injector(['ng', 'ngResource']); 
var $resource = $injector.get('$resource'); 

tương tự cho các dịch vụ khác, trừ khi họ đang có trong các module khác vẫn còn. Sau đó thêm mô-đun đó vào mảng.

More info

+0

Có lẽ tôi không hiểu cái gì ở đây. Tôi đã thử điều này và nhận được kết quả tương tự. Tôi đã cập nhật bài đăng gốc của mình để bao gồm đề xuất của bạn. – akronymn

+0

Nó chỉ ra vấn đề với giải pháp này là $ tài nguyên không thực sự là một dịch vụ. Nó là một nhà máy. http://docs.angularjs.org/api/ngResource.$resource – akronymn

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