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