JSDOM + Ava - тестовая функция, которая опирается на глобальный `document` - PullRequest
1 голос
/ 30 апреля 2019

Я пишу некоторые утилиты, связанные с объектом document.

Допустим, я пишу объект, который использует document объект браузера.

// utils.js
export function myFn(callback) {
  document.addEventListener(callback);  
}

Мой тестовый файл выглядит так:

// utils.test.js
import test from "ava";
import { JSDOM } from "jsdom";
import sinon from "sinon";
import { myFn } from "./utils";

let dom, document;

test.beforeEach(() => {
  dom = new JSDOM();
  document = dom.window.document;
});

test("it calls the callback when document is ready", t => {
  let fakeCb = sinon.spy();
  myFn(fakeCb);
  t.true(fakeCb.called);
});

После выполнения этого теста я получил ссылку ReferenceError, сообщающую, что «документ не определен», что имеет смысл.

У меня такой вопрос: как можно было бы использовать переменную document из моего теста внутри тестируемой функции?

Эта функция работает, если я передаю ей параметр document, но это ужасное решение.

1 Ответ

1 голос
/ 30 апреля 2019

Node.js обеспечивает доступ к глобальному пространству имен через global.

Установите document на global, и он будет доступен в вашем коде:

// utils.test.js
import test from "ava";
import { JSDOM } from "jsdom";
import sinon from "sinon";
import { myFn } from "./utils";

test.beforeEach(() => {
  global.document = new JSDOM().window.document;
});

test("it calls the callback when document is ready", t => {
  // ...
});
...