Настройка jsdom в Jest для нескольких тестов без использования модулей - PullRequest
0 голосов
/ 26 июня 2018

Я хочу протестировать скрипты в среде, где мы не можем экспортировать модули.Я установил Jest версии 23.1.0, и в моем файле package.json нет других пакетов.Используя jsdom 'old' api Я нашел решение, которое работает, как и ожидалось:

script.js

var exVar = "test";

script.test.js

const jsdom = require('jsdom/lib/old-api.js');

test('old jsdom api config', function(done) {
    jsdom.env({
        html: "<html><body></body></html>",
        scripts: [__dirname + "/script.js"],
        done: function (err, window) {
            expect(window.exVar).toBe("test");
            done();
        }
    });
});

Однако с этой реализацией мне приходится переписывать конфигурацию для каждого теста, потому что похоже, что конфигурация jsdom переписывается каждый раз.

Что я пробовал

До сих пор я пытался запустить эту конфигурацию:

const jsdom = require('jsdom/lib/old-api.js');
jsdom.env({
    html: "<html><body></body></html>",
    scripts: [__dirname + "/script.js"],
    done: function (err, window) {
        console.log('end');
    }
});

с этим тестом:

test('old jsdom api config', function(done) {
   expect(window.exVar).toBe("test");
   done();
});

по-разному: внутри beforeAll, внутри скрипта, связанного через setupFiles или через setupTestFrameworkScriptFile в объекте конфигурации Jest, но все равно ничего не работает.

Возможно, я мог бы расширить jest-environment, как предложено в документах , но я понятия не имею ни о синтаксисе, который мне следует использовать, ни о том, как связать этот файл с тестами.

1 Ответ

0 голосов
/ 03 июля 2018

Благодаря моему коллеге Андреа Талон Я нашел способ использовать одну и ту же настройку для разных тестов (по крайней мере, внутри одного и того же файла), используя «Стандартный API» (не «старый API»). «).

Вот полный тестовый файл.

const {JSDOM} = require("jsdom")
const fs = require("fs")

// file to test
const srcFile = fs.readFileSync("script.js", { encoding: "utf-8" })

// the window
let window

describe('script.js test', () => {
  beforeAll((done) => {
    window = new JSDOM(``, {
      runScripts: "dangerously"
    }).window

    const scriptEl = window.document.createElement("script")
    scriptEl.textContent = srcFile
    window.document.body.appendChild(scriptEl)
    done()
  })

  test('variable is correctly working', (done) => {
    expect(window.exVar).toBe("test");
    done()
  })

})

Дополнительная настройка

Чтобы загрузить несколько скриптов, я создал эту функцию, которая принимает массив скриптов:

function loadExternalScripts (window, srcArray) {
  srcArray.forEach(src => {
    const scriptEl = window.document.createElement("script")
    scriptEl.textContent = src
    window.document.body.appendChild(scriptEl)
  });
}

Таким образом, вместо добавления каждого отдельного скрипта в переменную window, я могу загрузить их, объявив их в верхней части файла следующим образом:

// files to test
const jQueryFile = fs.readFileSync("jquery.js", { encoding: "utf-8" })
const srcFile = fs.readFileSync("lib.js", { encoding: "utf-8" })

, а затем внутри функции beforeAll я могу загрузить их так:

loadExternalScripts(window, [jQueryFile, srcFile])
...