在不使用模块的情况下跨多个测试在Jest中配置jsdom

时间:2018-06-26 09:09:06

标签: javascript node.js jestjs jsdom

我想在无法导出模块的环境中测试脚本。我已经安装了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内,在Jest配置对象中通过setupFiles或通过setupTestFrameworkScriptFile链接的脚本中,但仍然无效。

也许我可以按照docs中的建议扩展jest-environment,但是我不知道应该使用的语法,也不知道如何将此文件链接到测试。

1 个答案:

答案 0 :(得分:1)

感谢我的同事Andrea Talon,我发现了一种使用“标准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])