14

我想要的是

我的代码广泛依赖于全局窗口对象(及其方法),它没有完全由 jsdom 实现,但在真实的浏览器环境中可用。所以我想在 puppeteer 页面上下文环境中运行单元测试,以便覆盖的代码(及其依赖项)可以访问真实的窗口对象。

问题

主要问题是 puppeteer 设计为在页面上下文之外运行 e2e 测试。我发现没有办法像 jsdom 那样在页面上下文中执行具体的测试套件而不运行整个构建,尽管它是公共界面/GUI(这会扼杀整个单元测试的想法)。

我试过的

我尝试编写自定义测试环境来运行 puppeteer page.evaluate 可以访问窗口对象的上下文中的每个测试套件:

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;
   }
  }
};

但似乎 puppeteer 序列化了评估参数,所以我找不到在它的上下文中进行 runScript 调用的方法。

我还尝试将评估窗口对象克隆到全局变量中,但由于同样的原因没有任何运气(序列化问题)

 async setup(config){
   const setupResult = await super.setup(config);
   const window = await this.global.page.evaluate( () => window)
   this.globals.window = window;
   return setupResult;
  }
};
4

0 回答 0