Chai assert.deepEqual выдает ошибку TypeError: правая часть «instanceof» не является объектом при использовании 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;
}


person Aneesa Saleh    schedule 07.12.2017    source источник


Ответы (1)


Ваша проблема вызвана тем, что вы только частично приближаетесь к имитации среды DOM в Node. Вы устанавливаете несколько переменных и останавливаетесь на этом, и в итоге вы получаете что-то, что не является ни стандартной средой Node, ни средой DOM.

chai использует deep-eql для выполнения глубокого сравнения, а deep-eql использует пакет с именем type-detect для выполнения части своей работы. type-detect выполняет тест, который указывает ему, что он работает в среде DOM, и в конечном итоге пытается выполнить это:

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

Так как вы не скопировали HTMLElement из window в global, то он завершается с ошибкой, которую вы получаете. Вы можете исправить это, добавив:

global.HTMLElement = window.HTMLElement;
person Louis    schedule 07.12.2017