хуйу нас не матерятся
Продолжаем пилить express API сервер. После того как мы сделали простейшую реализацию приложения, нам нужно сделать несколько очень полезных шагов: подключить eslint и автотесты. Подключаем eslint
Это самый простейший шаг для улучшения качества кода. Для начала его нужно установить, открываем package.json и добавляем пару новых пакетов в зависимости:
"dependencies": {
"express": "*",
"express-ws": "*",
"eslint": "*",
"mocha": "*"
}
Заодно добавили пакет "mocha", он нам потребуется немного погодя. Далее выполняем:
npm install
И выполняем
eslint --init
Либо, можем вручную создать файл .eslintrc.json со следующим содержимым:
{
"env": {
"node": true,
"es6": true
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
},
"rules": {
"no-console": 0,
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"never"
]
}
}
Теперь с помощью команды:
eslint js/*
Мы сможем проверить весь наш проект, в моём случае получилось:
Пара ошибок связана с неправильными отступами, ещё пара с объявленными но неиспользуемыми переменными. И одна настоящая ошибка:
Я просто напросто не подключил модуль errors в наш единственный экшен. После такой демонстрации, думаю будет излишне рассказывать зачем нужен eslint.
Создаём папку test в корне нашего проекта, создаём файл router.js и пишем простенькие тестики:
'use strict'
const Router = require('../js/router')
describe('Router', function() {
it('parseRequest', function(done) {
const wrongData = 'ign98374g5yg'
const rightData = JSON.stringify({
get: 'randomString',
length: 123
})
const router = new Router()
if( router.parseRequest(rightData) && !router.parseRequest(wrongData) )
done()
})
it('go', function(done) {
const router = new Router()
let wrongResult = false
const wrongData = JSON.stringify({
get: 'unknownAction',
param: 123
})
const rightData = JSON.stringify({
get: 'randomString',
length: 10
})
const rightWs = {
send: function (str) {
let data = JSON.parse(str)
if( (data.code == 200) && wrongResult )
done()
}
}
const wrongWs = {
send: function (str) {
let data = JSON.parse(str)
if( data.code == 404 )
wrongResult = true
router.go({}, rightWs, rightData)
}
}
router.go({}, wrongWs, wrongData)
})
})
Затем создаём автотесты для нашего единственного экшена, файл randomString.js:
'use strict'
const RandomString = require('../js/actions/randomString')
describe('action/randomString', function() {
it('getRandomString', function(done) {
const randomString = new RandomString()
const result = randomString.getRandomString(10)
if( result.length == 10 )
done()
})
it('response', function(done) {
const randomString = new RandomString()
let wrongResult = false
const rightData = {
get: 'randomString',
length: 12
}
const wrongData = {
get: 'randomString',
asd: 12
}
const rightWs = {
send: function (str) {
let data = JSON.parse(str)
if( (data.code == 200) && (data.data.length == 12) && (typeof(data.data) == 'string') && wrongResult )
done()
}
}
const wrongWs = {
send: function (str) {
let data = JSON.parse(str)
if( data.code == 400 )
wrongResult = true
randomString.response(rightWs, rightData)
}
}
randomString.response(wrongWs, wrongData)
})
})
Автотесты готовы. Теперь подправим наш package.json, в нём нужно указать как запускать тесты и линт, обновляем секцию "scripts":
"scripts": {
"test": "mocha --reporter spec --bail --check-leaks test/",
"lint": "eslint ./js/*"
},
Весь package.json теперь выглядит так:
{
"name": "api-express",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "mocha --reporter spec --bail --check-leaks test/",
"lint": "eslint ./js/*"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "*",
"express-ws": "*",
"eslint": "*",
"mocha": "*"
}
}
Из корня проекта запускаем тесты:
npm test
На выходе получаем:
Значит всё ок.
Если Вы задумались над этим вопросом, значит Вы явно не сталкивались с большими проектами, которые пилят одновременно много людей.
Автотесты позволяют убедиться что новый код совместим со старым и поведение старого кода не изменилось. Например если другой разработчик в нашем контроллере что-то поломает, то автотесты это покажут.
В по настоящему большом проекте Вы физически не можете отследить все изменения кода, более того, спустя время, Вы сами начинаете забывать где и что делали, и можете что-то поломать, автотесты об этом сразу скажут.