2013-08-01 23 views

Trả lời

29

Bạn cần tạo một sự kiện theo chương trình và kích hoạt sự kiện đó. Để làm như vậy, bao gồm jQuery cho các bài kiểm tra đơn vị là khá hữu ích. Ví dụ, bạn có thể viết một tiện ích đơn giản như thế này:

var triggerKeyDown = function (element, keyCode) { 
    var e = $.Event("keydown"); 
    e.which = keyCode; 
    element.trigger(e); 
    }; 

và sau đó sử dụng nó trong bài kiểm tra đơn vị bạn như vậy:

triggerKeyDown(element, 13); 

Bạn có thể thấy kỹ thuật này trong hành động trong http://angular-ui.github.io/bootstrap/ dự án ở đây: https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/test/typeahead.spec.js

Tuyên bố từ chối: hãy chính xác ở đây: Tôi không ủng hộ việc sử dụng jQuery với AngularJS! Tôi chỉ nói rằng nó là một tiện ích thao tác DOM hữu ích để viết các bài kiểm tra tương tác với DOM.

Để làm cho đoạn code làm việc trên mà không jQuery, thay đổi:

$.Event('keydown') 

tới:

angular.element.Event('keydown') 
+3

Nhược điểm là jQuery sẽ dễ dàng thay thế jQueryLite bằng góc cạnh. Vì có những khác biệt về chức năng thực tế, về cơ bản bạn đang thử nghiệm một hệ thống khác (hơi) bằng cách bao gồm nó trong các bài kiểm tra đơn vị của bạn. – Cornelius

+13

Có phải angular.element.Event vẫn có sẵn không? Tôi nhận được không xác định, và tôi không thể nhìn thấy bất cứ điều gì về nó trong tài liệu. https://docs.angularjs.org/api/ng/function/angular.element – Johnus

+6

Tôi nghĩ rằng điều này không hoạt động nữa. – BuildTester1

11

Tôi đã có vấn đề với việc sử dụng câu trả lời chấp nhận. Tôi tìm thấy linh hồn khác.

var e = new window.KeyboardEvent('keydown', { 
    bubbles: true, 
    cancelable: true, 
    shiftKey: true 
}); 

delete e.keyCode; 
Object.defineProperty(e, 'keyCode', {'value': 27}); 

$document[0].dispatchEvent(e); 

dụ làm việc có thể được tìm thấy here

+0

Tôi đã sử dụng trình duyệt này để +1 nhưng có vẻ như nó không hoạt động trong PhantomJS. –

+0

Tôi đang sử dụng Chrome trong cấu hình nghiệp của mình, bởi vì PhantomJS không hỗ trợ 'bind' –

+3

Điều gì sẽ làm việc với PhantomJS? –

5

tôi có một cái gì đó giống như làm việc này.

element.triggerHandler({type:"keydown", which:keyCode}); 
+0

Công trình này hoàn hảo! –

1

nếu bạn đang sử dụng angular2, bạn có thể kích hoạt bất kỳ sự kiện bằng cách gọi dispatchEvent(new Event('mousedown')) trên HTMLElement dụ. ví dụ: Thử nghiệm với góc 2.rc1

it('should ...', async(inject([TestComponentBuilder], (tcb:TestComponentBuilder) => { 
return tcb.createAsync(TestComponent).then((fixture: ComponentFixture<any>) => { 
    fixture.detectChanges(); 

    let com = fixture.componentInstance; 

    /* query your component to select element*/ 
    let div:HTMLElement = fixture.nativeElement.querySelector('div'); 

/* If you want to test @output you can subscribe to its event*/ 
    com.resizeTest.subscribe((x:any)=>{ 
    expect(x).toBe('someValue'); 
    }); 
    /* If you want to test some component internal you can register an event listener*/ 
    div.addEventListener('click',(x)=>{ 
    expect(x).toBe('someOtherValue'); 
    }); 
    /* if you want to trigger an event on selected HTMLElement*/ 
    div.dispatchEvent(new Event('mousedown')); 
    /* For click events you can use this short form*/ 
    div.click(); 

    fixture.detectChanges(); 
}); 
+0

và cách này trả lời câu hỏi? Làm thế nào bạn có thể kích hoạt các sự kiện keyup/keydown với dispatchEvent? Sự kiện mới ('keydown.esc') không hoạt động – akcasoy

0

thời gian gần đây tôi muốn thử nghiệm HostListener này trên một thành phần (góc 2):

@HostListener('keydown.esc') onEsc() { 
    this.componentCloseFn(); 
    }; 

Và sau khi tìm kiếm một thời gian, điều này đang làm việc :

.. 
nativeElement.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); 
... 
Các vấn đề liên quan