В модульных тестах Jasmine: Не удается разрешить все параметры для TestFormInputComponentBase

Только для фона событие «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
    }
})
4
задан Botond Béres 21 January 2019 в 12:06
поделиться

2 ответа

Есть много разных способов решения этой проблемы, но вы можете заглушить это прямо в вызове 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 , которая показывает это Бег. Я также добавил еще один тест, чтобы показать безошибочную инициализацию.

Надеюсь, это поможет!

0
ответ дан dmcgrandle 21 January 2019 в 12:06
поделиться

Вы хотите протестировать GenFormInputComponentBase, так почему бы не протестировать его без TestFormInputComponent

   TestBed.configureTestingModule({
        declarations: [
            GenFormInputComponentBase,
        ],
        providers: [
          {
                provide: LanguageService,
                useValue: {}
          }
        ]
    });

Или с поставщиками LanguageService выглядит следующим образом:

        providers: [
          LanguageService,
          {
                provide: Injector,
                useValue: {}
          }
        ]
0
ответ дан Adam Michalski 21 January 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: