Можно ли установить event.isTrusted в true в модульных тестах JEST?

#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 невозможна […]»