Chai assert.deepEqual throws error "TypeError: Right-hand side of 'instanceof' is not an object" when using atob

Chai assert.deepEqual throws error "TypeError: Right-hand side of 'instanceof' is not an object" when using atob

我正在使用 Chai 和 Mocha 运行 测试我的辅助函数。我使用 JSDOM 来包含 atob 和 btoa。这是我的 setup.js 文件:

const { JSDOM } = require('jsdom');

const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;

global.window = window;
global.document = window.document
global.btoa = window.btoa;
global.atob = window.atob;

当我尝试 运行 我的测试时,出现此错误:

TypeError: Right-hand side of 'instanceof' is not an object.

我的测试函数:

describe('helpers', () => {
  const testObject = { id: 1 };
  const encodedObject = base64EncodeObject(testObject);
  const decodedObject = base64DecodeObject(encodedObject);
  
  describe('base64DecodeObject()', () => {
    it('decoded object should match original object', () => {
      assert.deepEqual(decodedObject, testObject);
    });
  });
});

目标函数:

const base64DecodeObject = (base64String) => {
  let object = atob(base64String);
  object = JSON.parse(object);
  return object;
}

你的问题是由于你只是部分地模仿 Node.js 中的 DOM 环境。你设置了一些变量并停在那里,所以你最终得到的东西既不是标准的 Node 环境,也不是 DOM 环境。

chai 使用 deep-eql 进行深度比较,deep-eql 使用名为 type-detect 的包来完成一些工作。 type-detect 执行一项测试,表明它在 DOM 环境中处于 运行,最终它尝试执行 this:

if (obj instanceof globalObject.HTMLElement && obj.tagName === 'BLOCKQUOTE') {

由于您没有将 HTMLElementwindow 复制到 global,因此它失败并出现错误。您可以通过添加来修复它:

global.HTMLElement = window.HTMLElement;