Что я хочу
Мой код широко зависит от объекта глобального окна (и его методов), который не полностью реализован jsdom, но доступен в реальной среде браузера.Поэтому я хочу запустить модульные тесты в среде контекста страницы кукловода, чтобы покрытый код (и его зависимости) мог получить доступ к реальному объекту окна.
Проблема
Основная проблема заключается в том, чтоPuppeteer предназначен для запуска тестов e2e вне контекста страницы.Я не нахожу способа выполнить конкретный тестовый костюм в контексте страницы , как это делает jsdom, не выполняя целую сборку, хотя это общедоступный интерфейс / графический интерфейс пользователя (который убивает всю идею модульного теста).
Чтоя попытался
Я пытался написать пользовательскую среду тестирования для запуска каждого набора тестов внутри страницы 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;
}
};