Разработка через тестирование — это отличная методология разработки (а не тестирования). Это определенно поможет вам произвести:
- Минимум кода для реализации бизнес-потребностей
- Маленькие функции
- Код покрыт тестами, что позволяет избежать последующих регрессий
Мы используем его каждый день в Промызе и окончательно убедились в преимуществах такого кодирования.
Иллюстрация
Теперь давайте посмотрим, как вы можете применить 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 ;-)