javascript - 如何用 Jest 测试传递给 document.body.appendChild 的参数

标签 javascript jestjs

我有一个创建脚本元素并将其添加到正文的函数。它看起来有点像这样:

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 来测试这段代码?

最佳答案

正如@Alex 指出的那样,document.createElement 创建了一个 HTMLScriptElement 对象。

您可以通过使用 expect.objectContaining 检查其属性来测试是否正确创建了 HTMLScriptElement:

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!
});

关于javascript - 如何用 Jest 测试传递给 document.body.appendChild 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165762/

相关文章:

javascript - 数组中的每个字符都被 javascript 中的 ".hasOwnProperty(i)"识别为 Google Apps 脚本的 true

javascript - 为 Jest 测试设定时间目标

typescript - 类型上不存在 Jest typescript 属性模拟

reactjs - 通过 CI 测试与本地测试时的 Jest 快照有所不同

javascript - 多应用程序错误 : Cannot resolve module 'babel-loader' after upgrading babel to v7

javascript - 在javascript中旋转图像

javascript - 改进 Javascript Mandelbrot 绘图性能

javascript - 模拟来自同一个类的 promise 返回方法

javascript - 如何使用 JavaScript 将焦点设置在隐藏的文本框字段上?

javascript - 在模型更新之前调用 Angular Directive(指令)内的回调