Как вы структурируете свои тесты для своих серверных приложений в Node.js?

Я начинаю добавлять тесты в наши серверные приложения Node.js, так как мы медленно внедряемся в производство. У меня есть API с множеством возможных запросов для тестирования.

Мой вопрос: как вы структурируете свои тесты, чтобы он не стал большим файлом, в котором вы быстро потерялись?

Я написал тесты для маршрута API один (у меня есть много других маршрутов API для тестирования), и так оно выглядит (в обзоре Sublime):

code hell

И этот тест еще не охватывает все случаи.

Я использую mocha, а также should и expect для проверки и superagent для вызовов API. Как бы вы структурировали эти тесты, чтобы он не развивался в отвратительном большом файле?

Ответы

Ответ 1

Существует множество способов разбить файлы на более мелкие, более управляемые части. Большинство из них поворачиваются вокруг использования флага --recursive в mocha. В конце концов, это вопрос личного выбора и того, что работает для команды/человека.

Вариант 1: Пространство имен через точечную нотацию

Запустите mocha без флага --recursive и назовите свои файлы с помощью точечной нотации. Затем вы можете разбить его по HTTP-методу и даже дальше, если хотите, с помощью pass/fail. Например, маршрут пользователя будет иметь имя файла, например route.user.get.pass.js, и находиться в корневом каталоге test/. Код для этого файла будет выглядеть так:

describe('GET /users', function () {
  describe('when the request is valid', function () {
    it('should return 200 OK');
    it('should have unicorns');
    it('should have ponies too');
  });
});

И тогда другой тест с именем файла route.resource.post.fail.js будет выглядеть так:

describe('POST /users', function () {
  describe('when the request is invalid', function () {
    it('should return 400 Bad Request');
    ...
  });
});

Это означает, что люди grepping испытывают легкий ветер при использовании mocha функции grep

Вариант 2: размещение имен через папки

Как и в случае с вариантом 1, в этом случае вы используете флаг --recursive при запуске mocha и используете папки вместо вложенных имен файлов.

test/
  routes/
    users/
      post.js
      get.js
      put.js
  models/
    User.js

Вариант 3: Разделить с помощью модулей

Этот подход представляет собой комбинацию первых двух и должен выполняться без флага --recursive. В корневом каталоге test вы должны указать спецификационный файл как routes.userSpec.js с кодом типа:

describe('/users', function () {

  describe('GET', function () {

    var tests = require('./users/get');

    it('should return 200 OK', tests.200);
    it('should have unicorns', tests.unicorns);
    it('should have ponies too', tests.ponies);

  });

  describe('POST', function () {

    var tests = require('./users/post');

    it('should return 200 OK', tests.200);
    it('should create unicorns', tests.unicorns);
    it('should create ponies too', tests.ponies);

  });

});

И тогда вы определяете модули в папке test/users, которые выглядят примерно так:

test/
  users/
    get.js
    post.js
  routes.userSpec.js

Вариант 4: сгибание кода

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