我想要的
我的代码广泛依赖于全局窗口对象(及其方法),而jsdom并未完全实现该对象,但在实际的浏览器环境中可用。因此,我想在操纵up页面上下文环境中运行单元测试,以便覆盖的代码(及其依赖项)可以访问真实的窗口对象。
问题
主要问题是操纵up的人设计为在页面上下文之外运行e2e测试。我发现没有办法执行具体的测试套件内部页面上下文,因为jsdom不能通过公共接口/ GUI运行整个构建,而这会杀死整个单元测试思想。
我尝试过的事情
我试图编写自定义测试环境以在puppeteer页面中运行每个测试套件。评估可以访问窗口对象的上下文:
const PuppeteerEnvironment = require('jest-environment-puppeteer');
module.exports = class TestEnvironment extends PuppeteerEnvironment {
constructor(config) {
super(config);
}
async runScript(script){
if(this.global.page){
return await this.global.page.evaluate((runner, script)=>{
return runner(script);
}, super.runScript, script)
} else{
return null;
}
}
};
但是似乎木偶戏序列化了评估参数,所以我找不到在上下文中进行runScript调用的方法。
我也试图将评估窗口对象克隆到全局变量中,但是由于相同的原因(序列化问题)没有任何运气
async setup(config){
const setupResult = await super.setup(config);
const window = await this.global.page.evaluate( () => window)
this.globals.window = window;
return setupResult;
}
};