Могу ли я запускать jest тесты как обычные js файлы? - PullRequest
1 голос
/ 14 февраля 2020

Jest использует describe и it и expect без необходимости require их. Это нормально, потому что если у вас есть тестовый файл с именем test.spec.js, вы никогда не выполните его напрямую, введя команду node test.spec.js.

Я хочу выполнить его, используя узел в качестве стандартного файла js , без необходимости использовать Jest Cli или npm test. Можно ли это сделать?

Например, я бы конвертировал следующий файл:

// taken from documentation
const user = require('./users.js')
it('works with promises', () => {
  expect.assertions(1);
  return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
});

Во что-то вроде

var {describe, it, expect} = require('jest-primitives') 
const user = require('./users.js')
it('works with promises', () => {
  expect.assertions(1);
  return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
});

, чтобы он сам -contained js файл, который может быть запущен с использованием только узла.

Полный список глобалов, которые предоставляет jest, дан здесь .

1 Ответ

2 голосов
/ 10 марта 2020

Это технически возможно? Да.

Должны ли вы? Возможно нет. (Но есть и лучшие способы - tl; dr использовать tape)

Фон

Jest - это испытательный комплект .

Jest - не единственный тестовый комплект для использования describe() и it(). Это типичные тестовые ключевые слова для поведенческой разработки (BDD) . Вы также найдете, что они используются с Mocha и другими.

describe() и it() - это функции, которые взаимодействуют с комплектом тестов, сообщая ему о необходимости добавления набора тестов и теста. дело соответственно. Затем тестовый жгут запускает тестовые наборы, собирает результаты, форматирует результаты и выводит их.

Почему вы не должны делать это с Jest

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

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

Как вы можете попытаться сделать это с Jest

Jest определяет пакеты runner в их монополе Jest. Один - Цирк , другой - Жасмин2 .

Circus export describe(), it() и некоторые другие ключевые слова , хотя они не очень полезны для нас, поскольку эти функции только внутренне создают наборы тестов и тестовые наборы, но не выставить их нам или дать нам способ управлять ими.

Jasmine2 экспорт исполняемой функции , которая возвращает обещание результата теста . Код для jasmineAsyncInstall создает большинство ключевых слов в env или глобально, и вы можете использовать их.

То, что вы хотели бы сделать здесь, это определить функции it() и describe(), либо глобально, как экспорт (если вы хотите использовать их, как в примере кода в вопросе), либо к счастью, определив их внутри основного модуля. Эти функции должны регистрировать контрольные примеры и наборы тестов. Вы захотите либо отслеживать тестовые случаи и запускать их позже, либо запускать их сразу и отслеживать результаты тестов.

Теперь проблема заключается в определении того, когда тестовый модуль завершил работу. То есть, когда все describe() и it() были выполнены (независимо от того, были ли выполнены сами тестовые примеры), а также любой другой код инцидента (код, который не находится ни в одном блоке). Нет хорошего способа справиться с этим, и вот где это может снова стать хакерским. Самый простой способ - добавить слушателя в process.on('exit'.

Почему это не имеет значения

Жгут проводов для испытаний - это, как правило, бегун и репортер. В частности, Jest - это просто набор компонентов, которые можно настраивать.

Если мы просто извлекаем здесь функцию и переменную из Jest, можем ли мы сказать, что мы все еще ее используем? Почему мы даже хотим? Там действительно нет причин использовать Jest здесь. Если вам не нравится, как он запускает тесты, вы должны использовать другой тестовый комплект вместо того, чтобы пытаться изменить его. Если вам нравится репортер, Jest экспортирует пакет, содержащий только репортера .

Лучший способ сделать работоспособными тестовые файлы

Использовать tap или tape . Они предназначены для работы так, как вы хотите, и настраиваются.

Пример:

const test = require('tape');
const MyClass = require('../src/my-class');

test('MyClass.doSometing should be true', (t) => {
    const result = MyClass.doSomething();

    if (result === true) {
      t.pass('The test passed! Hooray! Our class MyClass is seemingly error-free!');
    } else {
      t.fail('Oh noes. Our test has failed. Why am I such a bad programmer....?');
    }

    t.end();
});
...