#javascript #unit-testing #events #dom-events #readonly
#javascript #модульное тестирование #Мероприятия #dom-события #только для чтения
Вопрос:
Я работаю с событиями JavaScript. Согласно следующей статье MDN, объект события имеет вызываемый флаг isTrusted
. https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted
Я написал код, который отличает пользовательские события (запускаемые в результате фактического действия пользователя) от программных событий (запускаемых в результате element.dispatchEvent(...)
. Я не могу показать весь код, но он выглядит примерно так, как показано ниже:
document.addEventListener('click', (event) => {
if (event.isTrusted) {
// ... client code follows
// somewhere in the code I am dispatching another custom event on body element
document.body.dispatchEvent(...);
}
});
Я пытаюсь выполнить модульное тестирование этого кода в JEST
(популярной библиотеке модульного тестирования). К сожалению, мы не можем имитировать реальные события нажатия, поскольку это автоматический код, который делает это за вас. Флаг the isTrusted
всегда установлен false
в ШУТКУ, тем самым ограничивая меня в тестировании клиентского кода.
Я не могу изменить значение isTrusted
напрямую, поскольку это свойство доступно только для чтения. Я ищу способы, с помощью которых я могу издеваться над событием и устанавливать isTrusted
флаг true
.
Редактировать: добавлен тестовый код:
describe('Event.isTrusted', () => {
beforeAll(() => {
document.body.dispatchEvent = jest.fn();
const btn = document.createElement('button');
btn.id = 'btn';
document.body.appendChild(btn);
});
...
it('should allow user events', () => {
const event = new MouseEvent('click', {
bubbles: true,
cancellable: true
});
document.getElementById('btn').dispatchEvent(event);
expect(document.body.dispatchEvent).toHaveBeenCalled();
});
});
Еще раз, это всего лишь суть. Я не могу показать код клиента. Надеюсь, это поможет.
Комментарии:
1. Можете ли вы показать тестовый код?
2. @slideshowp2 Я добавил код модульного теста в вопрос
3. Вам действительно нужно идти по этому
dispatchEvent
пути? Разве вы не можете просто вызвать обратный вызов с помощью простого издевательского объекта? Установка объектаisTrusted
true Event невозможна, поэтому вам придется перезаписать весь код EventTarget.dispatchEvent с помощью addEventListeners и т. Д…4. Да, я могу это сделать, и в настоящее время я выбрал такой подход. Но это не отвечает на мой вопрос, действительно ли есть способ изменить объект события и установить
isTrusted
дляtrue
него значение, доступное только для чтения. Что, если я тестирую код, в котором у меня нет доступа к прослушивателю, и я на самом деле полагаюсь на него, чтобы мой код работал. Я имею в виду, что я просто привожу пример. Я знаю, что могу самостоятельно протестировать другую часть кода, но вы поняли суть. Могут быть сценарии.5. «Установка isTrusted [для] объекта true Event невозможна […]»