Настройка шутниковых тестов - PullRequest
1 голос
/ 26 марта 2019

Я использую jest для запуска модульных тестов на инструменте, который генерирует YAML и JSON, это не чистый javascript.Jest позволяет мне на самом деле проверять значения в выводе, так что это очень удобно.

У меня есть каталог, компоненты:

/workdir/components/
├── component1
└── component2

И в каждом из этих компонентов у меня есть тесткаталог с некоторыми шутками в нем.Вот пример теста:

// Define tests for component
//
const _ = require("lodash");
const componentName = 'my_component';
const {
    getTestEnvironmentComponents
} = require("../../../lib/testHelpers.js");

const component = getTestEnvironmentComponents(componentName);


test("Checking array properties", () => {
  expect(Array.isArray(component)).toBe(true);
  expect(component).toHaveLength(2);
});

Внутри testHelpers.js У меня есть это:

module.exports = {
  getTestEnvironmentComponents: function (component) {
    const contents = require('.././components/'+component+'/tmp/test-manifest.json');
    return contents;
  },
  },
};

Итак, у меня есть вспомогательный скрипт, который ожидает, что в каталоге компонентов будет создан сгенерированный файл JSON,

Теперь мне нужно создать этот файл JSON перед каждым тестом и для каждого компонента.Что делает это трудным, так это то, что метод создания этого файла JSON отличается для каждого компонента.Когда я проводил тестирование для одного компонента, я просто добавил jest.config.js к компоненту следующим образом:

module.exports = {
  globalSetup: "./test/0-setup.js",
  verbose: true,
};

И затем определил 0-setup.js для теста следующим образом:

// This file is the "globalSetup" file.
// FIXME: make this global somehow
module.exports = () => {
    const execa = require("execa");
    const fs = require("fs");
    const path = require("path");

    const command = "generate-json";
    const output = execa.shellSync(command);
    const testEnvironmentOutput = JSON.parse(output.stdout);

    if (!fs.existsSync("./tmp")) {
        fs.mkdirSync("./tmp");
    }

    fs.writeFileSync('./tmp/test-manifest.json', JSON.stringify(testEnvironmentOutput));
};

Это работает для одного компонента, но это означает, что для запуска моих jest тестов мне нужно пройти на каждый отдельный компонент и запустить jest отдельно.

Итак:

  • Есть ли способ определить задачи установки в каталоге компонентов?
  • Возможно, есть лучший способ сделать это так, чтобы я мог запустить jest из корневого каталога, и он будетпройти через поддеревья и запустить задачи установки другим способом?

1 Ответ

0 голосов
/ 27 марта 2019

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

Это звучит как идеальное использование beforeAll.

Вот очень упрощенный пример:

const componentName = 'my_component';

let component;

beforeAll(async () => {
  doSomePrepWork();
  await doSomethingAsync();
  doSomeMorePrepWork();
  component = getTestEnvironmentComponents(componentName);
});

test("Checking array properties", () => {
  expect(Array.isArray(component)).toBe(true);
  expect(component).toHaveLength(2);
});

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

Полезное примечание : если вам нужно выполнить асинхронную работу в beforeAll, вы можете передать ей функцию async (или передать ей обычную функцию, которая возвращает Promise), и она будет дождитесь разрешения полученного Promise, прежде чем Jest продолжите тестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...