Рубрики
Без рубрики

Тестирование кода Node.js с Mocha и Chai

Автор оригинала: Scott Robinson.

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

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

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

Чай

Chai – это библиотека утверждения, которая предоставляет как BDD и TDD Стили программирования для тестирования вашего кода в любой структуре тестирования.

На протяжении всей этой статьи мы сосредоточимся на стиле BDD, используя Chai’s ожидать интерфейс.

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

var user = {name: 'Scott'};

// Requirement: The object 'user' should have the property 'name'

expect(user).to.have.property('name');

Еще несколько примеров этих получений:

  • к
  • быть
  • является
  • а также
  • имеет
  • имеют

Довольно немногие из этих получений могут быть привязаны и использованы с методами утверждения, такие как правда , Хорошо , существуют и Пустой создать некоторые сложные утверждения только в одной строке. Несколько примеров:

"use strict";

var expect = require('chai').expect;

// Simple assertions
expect({}).to.exist;
expect(26).to.equal(26);
expect(false).to.be.false;
expect('hello').to.be.string;

// Modifiers ('not')
expect([1, 2, 3]).to.not.be.empty;

// Complex chains
expect([1, 2, 3]).to.have.length.of.at.least(3);

Полный список доступных методов можно найти здесь Отказ

Вы можете также захотеть проверить список доступных плагины для Чай. Они делают гораздо проще тестировать более сложные особенности.

Возьми Chai-http Например, который является плагином, который помогает вам тестировать маршруты серверов.

"use strict";

var chai = require('chai');
var chaiHttp = require('chai-http');

chai.use(chaiHttp);

chai.request(app)
    .put('/api/auth')
    .send({username: '[email protected]', passsword: 'abc123'})
    .end(function(err, res) {
        expect(err).to.be.null;
        expect(res).to.have.status(200);
    });

Моча

Mocha – это основа тестирования для Node.js, которая дает вам гибкость для запуска асинхронного (или синхронного) кода последовательно. Любые неопрятные исключения показаны рядом с тестовым случаем, в котором его было брошено, что облегчает идентичность точно, что не удалось и почему.

Чтобы использовать Mocha, я бы предложил вы установить его по всему миру с NPM:

$ npm install mocha -g

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

Создание тестовых случаев легко используют Опишите () метод. Опишите () используется для внесения структуры к вашим тестам путем группировки других Опишите () звонки и Это () Методы вместе, где расположены фактические тесты. Это, вероятно, лучше всего описать с примером:

"use strict";

var expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });
    });
});

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

Чтобы запустить эти тесты, сохраните свой файл и используйте моча команда:

$ mocha .


  Math
    #abs()
      ✓ should return positive value of given number 


  1 passing (9ms)

Выход – это разбивка испытаний, которые управляли и их результаты. Обратите внимание, как вложенные Опишите () Звонки переносятся на результаты вывода. Полезно иметь все тесты для данного метода или функции, вложенного вместе.

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

Писать тесты

Рекомендуемый способ организовать свои тесты в вашем проекте – поставить их все свои /test каталог. По умолчанию Mocha проверяет модульные тесты, используя все шары ./test/*.js и ./test/*.coffee Отказ Оттуда он будет загружен и выполнить любой файл, который называет Опишите () метод.

Лично я люблю использовать суффикс .est.js Для исходных файлов, которые фактически содержат тесты Mocha. Таким образом, пример структуры каталогов может выглядеть так:

├── package.json
├── lib
│   ├── db.js
│   ├── models.js
│   └── util.js
└── test
    ├── db.test.js
    ├── models.test.js
    ├── util.test.js
    └── util.js

Util.js не будет содержать фактические модульные тесты, просто полезные функции, чтобы помочь с тестированием.

Вы можете использовать любую структуру, имея смысл для вас (что является хорошей вещью о Mocha), но это хорошо сработало для меня в прошлом.

Когда дело доходит до на самом деле писать тесты, это помогает организовать их использовать Опишите () методы. Вы можете организовать их по функциям, функциям, файлу или что-то еще.

Расширение на нашем примере из предыдущего раздела, мы решим организовать тесты по функции, что приводит к тому, что выглядит так:

"use strict";

var expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });
});

Запуск тестов, затем даст вам выход:

$ mocha .


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 


  3 passing (11ms)

Расширяя еще больше (я обещаю, это последний я покажу), у вас даже есть тесты на несколько методов в одном файле. В этом случае методы сгруппированы Математика объект:

"use strict";

var expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });

    describe('#sqrt()', function() {
        it('should return the square root of a given positive number', function() {
            expect(Math.sqrt(25)).to.be.equal(5);
        });

        it('should return NaN for a given negative number', function() {
            expect(Math.sqrt(-9)).to.be.NaN;
        });

        it('should return 0 given 0', function() {
            expect(Math.sqrt(0)).to.be.equal(0);
        });
    });
});

Выход:

$ mocha .


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

Хорошо, вы получаете идею.

По общему признанию, большинство единичных тестов не так просто. Много раз вам, вероятно, понадобятся другие ресурсы для выполнения ваших тестов, таких как база данных, или какой-то другой внешний ресурс. Для того, чтобы установить это, мы можем использовать один или несколько из следующих Мокский крючок Методы:

  • до () : Бежит перед всеми тестами в данном блоке
  • Rebedeach () : Работает перед каждым тестом в данном блоке
  • после () : Проходит после всех испытаний в данном блоке
  • Upoted () : Проходит после каждого теста в данном блоке

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

"use strict";

var expect = require('chai').expect;
var Camo = require('camo');
var User = require('../models').User;

describe('Users', function() {

    var database = null;

    before(function(done) {
        Camo.connect('mongodb://localhost/app_test').then(function(db) {
            database = db;
            return database.dropDatabase();
        }).then(function() {}).then(done, done);
    });

    afterEach(function(done) {
        database.dropDatabase().then(function() {}).then(done, done);
    });

    describe('#save()', function() {
        it('should save User data to database', function(done) {
            // Use your database here...
        });
    });

    describe('#load()', function() {
        it('should load User data from database', function(done) {
            // Use your database here...
        });
    });
});

До любой Испытания запускаются, функция отправлена нашему до () Метод запускается (и запущен только один раз на протяжении тестов), который устанавливает соединение с базой данных. Как только это будет сделано, наши тестовые люксы затем запускаются.

Поскольку мы не хотели бы данные из одного тестового набора повлиять на наши другие тесты, нам нужно очистить данные из нашей базы данных после запуска каждого набора. Это то, что Upoted () для. Мы используем этот крюк для очистки всех данных базы данных после каждый Тестовый корпус работает, поэтому мы можем начать с чистого шифера для следующих тестов.

Бегущие тесты

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

$ mocha


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

Это немного отличается от наших предыдущих примеров, поскольку нам не нужно было рассказывать Mocha, где были расположены наши тесты. В этом примере тестовый код находится в ожидаемом месте /test Отказ

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

Для таких случаев, вы должны сказать Mocha, какие тесты для бега. Это можно сделать с помощью -G или -f <суб-строка> параметры.

Опять же, используя примеры сверху, мы можем использовать -G Возможность запустить только наши #sqrt () Тесты:

$ mocha -g sqrt


  Math
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  3 passing (10ms)

Обратите внимание, что #abs () Тесты не были включены в этот прогон. Если вы планируете соответственно с вашими тестовыми именами, эта опция может быть использована только для выполнения определенных разделов ваших тестов.

Однако это не единственные полезные варианты. Вот несколько вариантов Mocha, которые вы можете проверить:

  • --invert : Инверты -G и -f Спички
  • - Измерение : Включать подкаталоги
  • --harmony : Включить все функции гармонии в узле

Вы можете проверить полный список вариантов, используя Mocha -H команда или на Эта страница Отказ

Где узнать больше

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

Вместо того, чтобы просто читать документацию, вы также можете попробовать курс по этому вопросу, который я связал ниже. Преподаватель приходит к значительному деталю о том, как настроить использование Mocha, Chai и Sinon для тестирования кода Node.js, а также углубленные видео для каждой темы.

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

Заключение

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

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

Есть любые полезные советы для написания тестов Mocha/Chai? Дайте нам знать об этом в комментариях!