Chai assert.deepEqual抛出错误" TypeError:' instanceof'的右侧不是一个对象"使用atob时

时间:2017-12-07 09:47:01

标签: javascript mocha chai jsdom

我使用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;
&#13;
&#13;
&#13;

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

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

我的测试功能:

&#13;
&#13;
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);
    });
  });
});
&#13;
&#13;
&#13;

目标函数:

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

1 个答案:

答案 0 :(得分:6)

您的问题是由于您只是在部分模仿Node中的DOM环境的过程中引起的。您设置了一些变量并停在那里,因此您最终得到的东西既不是库存节点环境,也不是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;