2014-10-22 13 views
5

Tôi đang cố gắng kiểm tra đơn vị chức năng liên kết với chỉ thị ngClick. Nó trông giống như thế này bây giờ khi chúng ta vừa mới bắt đầu vào dự án này và trước khi tôi nhận được đến nay tôi muốn có một số bảo hiểm thử nghiệm:

vm.open = function($event) { 
      $event.preventDefault(); 
      $event.stopPropagation(); 
      vm.opened = true; 
     }; 

tôi kiểm tra đơn vị như thế này:

describe('Unit: simpleSearchController', function(){ 
//include main module 
beforeEach(module('myApp')); 
var ctrl, scope, event ; 
// inject the $controller and $rootScope services 
// in the beforeEach block 
beforeEach(inject(function($controller, $rootScope){ 
    // Create a new scope that's a child of the $rootScope 
    scope = $rootScope.$new(); 
    // Create the controller and alias access using controllerAs 
    ctrl = $controller('simpleSearchController as vm', { 
     $scope: scope 
    }); 
})); 
// unit tests 
it('should set vm.opened to true', function(){ 
    event = scope.$broadcast("click"); 
    expect(event).toBeDefined(); 
    scope.vm.open(event); 
    expect(event.defaultPrevented).toBeTruthy(); 
    expect(scope.vm.opened).toBeTruthy(); 
}); 
}); 

Khi Karma chạy thử nghiệm tôi nhận được lỗi này:

TypeError: $event.stopPropagation is not a function. 

Bất kỳ ý tưởng nào?

+0

Bạn đã thử '$ ($ event) .stopPropagation();'? – algorhythm

+2

Khi bạn phát sự kiện, không có tuyên truyền dừng nào phải không? phát sóng đi xuống, stopPropagation là cho phát ra. Bạn đã thử sử dụng $ emit. hoặc chỉ cần tạo một đối tượng sự kiện giả và chỉ cần theo dõi các phương thức. Bạn không thực sự cần kiểm tra 'expect (event.defaultPrevented) .toBeTruthy();' nó đã được thử nghiệm như một phần của lõi góc. – PSL

+0

bạn chính xác @PSL, vui lòng thêm làm câu trả lời và tôi sẽ chấp nhận –

Trả lời

9

vấn đề của bạn là không có phương pháp stopPropagation trên các sự kiện $broadcasted. phát tán truyền xuống và dừngPropagation (có sẵn trong $emit) được sử dụng để ngăn ngừa sự lan truyền tiếp theo. Vì vậy, bạn có 2 lựa chọn.

Hoặc sử dụng $emit

it('should set vm.opened to true', function(){ 
     event = scope.$emit("click"); 
     expect(event).toBeDefined(); 
     scope.vm.open(event); 
     expect(event.defaultPrevented).toBeTruthy(); 
     expect(scope.vm.opened).toBeTruthy(); 
    }); 

Hoặc chỉ cần tạo một đối tượng giả cho sự kiện này.

it('should set vm.opened to true', function(){ 
      event = jasmine.createSpyObj('event', ['preventDefault', 'stopPropagation']); 
      scope.vm.open(event); 
      expect(event.preventDefault).toHaveBeenCalled(); 
      expect(scope.vm.opened).toBeTruthy(); 
     }); 

Cũng lưu ý rằng bạn thực sự không cần phải kiểm tra expect(event.defaultPrevented).toBeTruthy(); hoặc expect(event).toBeDefined(); vì đây là lõi chức năng góc khi preventDefault được gọi và nó đã được thử nghiệm.

0

Thay vì sử dụng stopPropagation() bạn có thể sử dụng trả về false. stopPropagation là một phương thức jQuery vì vậy nó nên được sử dụng trên các đối tượng jQuery.

này sẽ nhận được hiệu quả mong muốn giống nhau:

vm.open = function($event) {    
     vm.opened = true; 
     return false 
    }; 
+0

Tôi không nghĩ vậy là góc cạnh và không tìm giá trị trả lại. Nó sẽ ngăn chặn lỗi từ OP mặc dù. OP đang làm điều đó một cách sai lầm. – PSL

+0

@JohnStewart Test sẽ vượt qua. :) Nhưng đây không phải là sự kiện jquery. Đây là sự kiện tùy chỉnh được tạo bởi góc cạnh. Bản thân bài kiểm tra của bạn không chính xác. – PSL

+0

Bạn chính xác, chỉ cần xem http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false –

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