Разработка через тестирование — это отличная методология разработки (а не тестирования). Это определенно поможет вам произвести:

  • Минимум кода для реализации бизнес-потребностей
  • Маленькие функции
  • Код покрыт тестами, что позволяет избежать последующих регрессий

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

Иллюстрация

Теперь давайте посмотрим, как вы можете применить TDD с Mocha с помощью Typescript в проекте Node.js.

Весь код доступен в этом проекте Github.

Структура кода

В этом примере у нас есть эта простая структура:

.
├── domains
│   └── Bowling
│       ├── Game.spec.ts
│       └── Game.ts
├── LICENSE
├── package.json
├── package-lock.json
├── README.md
└── test
    └── mocha.spec.ts

domains содержит наш исходный код, а test содержит мой основной набор тестов.

Давайте теперь посмотрим на код.

пакет.json

Интересная часть здесь — это раздел scripts. Как видите, мы добавили параметр — watch Mocha в дополнение к параметру — watch-files. Здесь весь код в папках domain и test будет проверен на предмет модификации, и тесты будут автоматически запущены снова.

{
    "name": "node-tu-wacher",
    "devDependencies": {
        "@types/chai": "^4.2.18",
        "@types/mocha": "^8.2.2",
        "@types/node": "^15.6.2",
        "chai": "^4.3.4",
        "mocha": "^8.4.0",
        "ts-node": "^10.0.0",
        "typescript": "^4.3.2"
    },
    "engines": {
        "node": ">=14.16.1"
    },
    "scripts": {
        "test": " mocha -r ts-node/register test/mocha.spec.ts",
        "test:watch": " mocha -r ts-node/register --watch --watch-files domains/**/*.ts,test/*.ts test/mocha.spec.ts"
    }
}

тест/мокко.spec.ts

Это корневой тестовый файл, который будет импортировать все мои наборы тестов:

import GameSpec from '../domains/Bowling/Game.spec';
import { Suite } from 'mocha';
describe('Server unit testing', function(this: Suite) {
        describe('Game', GameSpec);
    }
);

домены/Боулинг/Game.spec.ts

Здесь мы предполагаем, что я только начал кодировать приложение для боулинга. Я написал свой первый тест:

import { expect } from 'chai';
import Game from './Game';
export default function() {
    describe('Game testing', function() {
        it('should start a bowling game', async function() {
            const game = new Game();
            expect(game.currentScore()).to.eql(0);
        });
    });
}

домены/Боулинг/Game.ts

А вот базовая реализация, чтобы можно было запустить мой первый тест:

export default class Game {
    private score: Number;
    constructor() {
        this.score = 0;
    }
    start(): void {
        this.score = 0;
    }
    currentScore(): Number {
        return this.score;
    }
}

Посмотреть в действии

Команда npm run test:watch поможет мне в сеансе TDD. Каждый раз, когда файл сохраняется (CTRL+S в вашей любимой IDE), тесты будут запускаться снова.

cteyton@laptop:~/node-tu-watcher$ npm run test:watch
> [email protected] test:watch /home/cteyton/Work/Promyze/blog/node-tu-watcher
>  mocha -r ts-node/register --watch --watch-files domains/**/*.ts,test/*.ts test/mocha.spec.ts
  Server unit testing
    Game
      Game testing
        ✓ should start a bowling game

  1 passing (2ms)
ℹ [mocha] waiting for changes...

Начните прямо сейчас и получайте удовольствие от TDD ;-)