Только для фона событие «keypress» даст вам свойство charCode всякий раз, когда вы нажимаете клавишу символа.
Editor.addEventListener('keypress', function(event){
if (event.charCode) {
//// character key
console.log( String.fromCharCode(event.charCode) ); /// convert charCode to intended character.
} else {
//// control key
}
Однако событие «keypress» не захватывает каждое нажатие клавиши - несколько клавиш загораются перед событием «keypress».
Напротив, событие «keydown» будет захватить каждое нажатие клавиши, но у него нет свойства charCode . Итак, как мы можем определить, является ли это символьным ключом? Проверка каждого нажатия клавиши, если значение keyCode находится в нижней и верхней границах для нескольких диапазонов, не является оптимально эффективной. Я подозреваю, что есть также проблемы для символов вне диапазона ASCII.
Мой подход - это проверка длины события «ключ». Свойство «ключ» является альтернативой «keyCode» для определения того, какой ключ был нажат. Для ключей управления свойство «ключ» является описательным (например, «rightArrow», «F12», «return» и т. Д.). Для символьных клавиш свойство «ключ» для символьного ключа - это только символ (например, «a», «A», «~», «\» и т. Д.). Следовательно, для каждого символьного ключа длина свойства «ключ» будет иметь длину 1; тогда как управляющие символы будут иметь длину больше 1.
Editor.addEventListener('keydown', function(event){
if (event.key.length == 1){
//// character key
} else {
//// control key
}
})
Есть много разных способов решения этой проблемы, но вы можете заглушить это прямо в вызове super()
в вашем TestFormInputComponent, например так:
class TestFormInputComponent extends GenFormInputComponentBase {
constructor() {
let injectorStub: Injector = { get() { return null } };
super(injectorStub);
}
}
Кроме того, вам нужно изменить то, как вы проверка на наличие ошибки в функции. См. Подробное обсуждение здесь . Как вы можете видеть в этом обсуждении, есть много способов сделать это, вот простой, использующий анонимную функцию:
it('should validate required `field` input on ngOnInit', () => {
expect(() => baseClass.ngOnInit()).toThrowError(
`Missing 'field' input in AppFormInputComponentBase`
);
});
Вот рабочая StackBlitz , которая показывает это Бег. Я также добавил еще один тест, чтобы показать безошибочную инициализацию.
Надеюсь, это поможет!
Вы хотите протестировать GenFormInputComponentBase
, так почему бы не протестировать его без TestFormInputComponent
TestBed.configureTestingModule({
declarations: [
GenFormInputComponentBase,
],
providers: [
{
provide: LanguageService,
useValue: {}
}
]
});
Или с поставщиками LanguageService выглядит следующим образом:
providers: [
LanguageService,
{
provide: Injector,
useValue: {}
}
]