Как проверить аргументы, переданные в document.body.appendChild с помощью jest - PullRequest
1 голос
/ 14 марта 2019

У меня есть функция, которая создает элемент сценария и добавляет его в тело.Это выглядит примерно так:

const s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'https://myscript';
s.id = 'abc';

document.body.appendChild(s);

Я использую тестирование с использованием jest и слежу за функцией appendChild, чтобы утверждать, что переданные параметры - это то, что я ожидаю.Что у меня выглядит так:

jest.spyOn(document.body, 'appendChild');

doFunction();

expect(document.body.appendChild).toBeCalledWith(
  '<script id="abc" src="https://myscript" type="text/javascript" />',
);

Несмотря на совпадение строк, аргумент, который передается в appendChild, не строка, а объект.

typeof document.body.appendChild.mock.child[0][0] // object

Я также пытался утверждать против объекта ({ type: '...' }, но не повезло. Какие еще варианты есть с jest для проверки этого бита кода?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Как указывает @Alex, document.createElement создает объект HTMLScriptElement.

Вы можете проверить правильность создания HTMLScriptElement, проверив его свойства, используя expect.objectContaining:

const doFunction = () => {
  const s = document.createElement('script');
  s.type = 'text/javascript';
  s.src = 'https://myscript';
  s.id = 'abc';

  document.body.appendChild(s);
}

test('doFunction', () => {
  jest.spyOn(document.body, 'appendChild');

  doFunction();

  expect(document.body.appendChild).toBeCalledWith(
    expect.objectContaining({
      type: 'text/javascript',
      src: 'https://myscript/',
      id: 'abc'
    })
  ); // Success!
});
2 голосов
/ 14 марта 2019

Вы можете утверждать, что appendChild вызывается с элементом HTML, что и возвращает document.createElement.

expect(document.body.appendChild).toBeCalledWith(expect.any(HTMLElement));

Вы можете дополнительно уточнить свой тест, проверив, что он был вызван с помощью элемента script.

expect(document.body.appendChild).toBeCalledWith(expect.any(HTMLScriptElement));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...