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') {
由于您没有将 HTMLElement
从 window
复制到 global
,因此它失败并出现错误。您可以通过添加来修复它:
global.HTMLElement = window.HTMLElement;
我正在使用 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') {
由于您没有将 HTMLElement
从 window
复制到 global
,因此它失败并出现错误。您可以通过添加来修复它:
global.HTMLElement = window.HTMLElement;