Интеграционное тестирование с Nuxt и Jest - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу отобразить страницу, используя Nuxt's renderAndGetWindow, чтобы проверить значения, возвращаемые моим API.

Вот как я это делаю:

// Nuxt instance
let nuxt = null;
// Our page to test
let homePage = null;

beforeAll(async (done) => {
    // Configuration
    const rootDir = resolve(__dirname, '../..');
    let config = {};
    config = require(resolve(rootDir, 'nuxt.config.js'));
    config.rootDir = rootDir; // project folder
    config.env.isDev = false; // dev build
    config.mode = 'universal'; // Isomorphic application

    nuxt = new Nuxt(config);
    await new Builder(nuxt).build();
    nuxt.listen(3001, 'localhost');
    homePage = await nuxt.renderAndGetWindow('http://localhost:3001/');
  });

Что дает мне 2различные ошибки:

console.error node_modules / jest-jasmine2 / build / jasmine / Env.js: 157 Необработанная ошибка

console.error node_modules / jest-jasmine2 / build / jasmine/Env.js:158 TypeError: setInterval (...). Unref не является функцией

И

Тайм-аут - асинхронный обратный вызов не вызывался в течение времени ожидания 5000 мсопределяется jest.setTimeout.

 at mapper (node_modules/jest-jasmine2/build/queue_runner.js:41:52)

Я получаю это с тех пор, как переключился с Ava на Jest.

Я неправильно обрабатываю рендеринг?

1 Ответ

0 голосов
/ 25 сентября 2018

unref

Средой тестирования по умолчанию для Jest является среда, подобная браузеру, через jsdom.

unref - специальная функция, предоставляемаяNode.Он не реализован в браузерах или jsdom, но он реализован в тестовой среде "node" в Jest.

Похоже, что для тестирования приложения Nuxt требуетсякак среда Node для запуска сервера, так и среда jsdom для проверки полученного пользовательского интерфейса.

Это можно сделать, установив для среды тестирования значение "узел" и инициализировав window с помощью jsdom во время настройки теста.

время ожидания

Jest будет "ждать, если вы предоставите аргумент для функции теста, обычно называемой done" .Это относится к функциям тестирования и настройкам, таким как beforeAll.

Ваша функция beforeAll имеет аргумент done, который никогда не вызывается.Jest будет ожидать вызова done или истечения времени ожидания, настроенного с помощью jest.setTimeout (по умолчанию 5 секунд).

Вы используете функцию async ииспользование await для асинхронной части функции, поэтому вам не нужно done.Измените функцию beforeAll, чтобы она не принимала никаких параметров, и это не позволит Jest ожидать вызова done.

В моих тестах запуск сервера Nuxt занимает довольно много времени, поэтому вы можетепередайте значение timeout в качестве дополнительного параметра в beforeAll, чтобы увеличить время ожидания только для этой функции.


Вот обновленный тест с этими изменениями:

/**
 * @jest-environment node
 */
// TODO: Set the environment to "node" in the Jest config and remove this docblock

// TODO: Move this to a setup file
const { JSDOM } = require('jsdom');
const { window } = new JSDOM();  // initialize window using jsdom

const resolve = require('path').resolve;
const { Nuxt, Builder } = require('nuxt');

// Nuxt instance
let nuxt = null;
// Our page to test
let homePage = null;

beforeAll(async () => {
  // Configuration
  const rootDir = resolve(__dirname, '../..');
  let config = {};
  config = require(resolve(rootDir, 'nuxt.config.js'));
  config.rootDir = rootDir; // project folder
  config.env.isDev = false; // dev build
  config.mode = 'universal'; // Isomorphic application

  nuxt = new Nuxt(config);
  await new Builder(nuxt).build();
  nuxt.listen(3001, 'localhost');
  homePage = await nuxt.renderAndGetWindow('http://localhost:3001/');
}, 20000);  // Give the beforeAll function a large timeout

afterAll(() => {
  nuxt.close();
});

describe('homepage', () => {
  it('should do something', () => {
  });
});
...