Запускать шутные юнит-тесты в реальной браузерной среде с доступом к окну при помощи кукловода

Что я хочу

Мой код широко зависит от объекта глобального окна (и его методов), который не полностью реализован 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? Можете ли вы просто предоставить простой фиктивный объект окна, содержащий фиктивные версии этих методов?

Итак, я хочу запускать модульные тесты в среде контекста страницы кукловода, чтобы покрытый код (и его зависимости) мог получить доступ к реальному объекту окна. ... (что убивает всю идею модульного теста)

Как только вы начнете запускать свой код в браузере, вы можете пересечь грань между модульными тестами и интеграционными или сквозными тестами. Я бы взглянул на ваш код и посмотрел, сможете ли вы абстрагироваться от логики, зависящей от области окна, и сосредоточиться на тестировании кода, не зависящего от окна.

Другие вопросы по тегам