如何在角度指令中测试按键事件

时间:2020-09-09 13:59:19

标签: angular unit-testing jasmine

我在Angular中有一条指令,当遇到textarea的最大长度时,该指令阻止使用Enter

@Directive({
    selector: '[abEnter]'
})
export class EnterDirective {
    @HostListener('keypress', ['$event'])
    onKeypress(event) {
        if ((event.target.textLength >= event.target.maxLength) && (event.keyCode === 13)) {
            event.preventDefault();
        }
    }
}

不确定如何测试。在尝试类似的东西

    it('should allow Enter key when maxlength is not met', () => {
            component.textareaValue = 'abc';
            fixture.detectChanges();
            
            const event = createEnterKeyPress();
            element.triggerEventHandler('keypress', event);
            expect(event.preventDefault).not.toHaveBeenCalled();
        });
    
        function createEnterKeyPress() {
            return {keyCode: 13, preventDefault: jasmine.createSpy('preventDefault')};
        }

但是它没有按预期工作

元素是:

element = fixture.debugElement.query(By.css('textarea'));

2 个答案:

答案 0 :(得分:0)

您应该使用Person myPerson = Person.FromFile("@c:\Public\PeopleFiles\JohnSmith.txt");

dispatchEvent

注意:不建议使用“按键”。但是您可以使用所需的任何事件类型。

答案 1 :(得分:0)

感谢您的答复。我尝试过:

fit('should not allow Enter when maxlength (10) is met', () => {
        component.textareaValue = '0123456789';
        fixture.detectChanges();

        const keydownEvent = new Event('keypress') as any;
        keydownEvent.which = KeyCodes.ENTER;
        keydownEvent.keyCode = KeyCodes.ENTER;
        const spy = spyOn(keydownEvent, 'preventDefault');

        const element: HTMLTextAreaElement = fixture.debugElement.query(By.css('textarea')).nativeElement;
        element.dispatchEvent(keydownEvent);
        expect(spy).toHaveBeenCalled();
    });

我期望它在达到mexlength时通过,并应调用preventDefault,但在这种情况下会失败。