-
Notifications
You must be signed in to change notification settings - Fork 57
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add unit test and integration test #34
base: master
Are you sure you want to change the base?
Conversation
'html-reporter/hermione': { | ||
path: 'hermione/hermione-html-report' | ||
}, | ||
[path.resolve(__dirname, './hermione/custom-commands/index.js')]: true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
удобнее было настроить в package.json обращение к собственному плагину как к пакету npm
https://medium.com/@the1mills/how-to-test-your-npm-module-without-publishing-it-every-5-minutes-1c4cb4b369be
it('В представление прокидывается набор данных, состоящий из заголовка, хлебных крошек и содержимого файла коммита коммита', async () => { | ||
await controller(request, response, () => {}, stubs); | ||
|
||
const params = response.render.getCall(1).args[1]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
если запустить этот тест отдельно от первого, то он упадет
|
||
const params = response.render.getCall(1).args[1]; | ||
|
||
expect(params).to.have.all.keys( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
не проверяется контент полученного объекта
{ type: '', hash: '', path: '' } | ||
])); | ||
stubs.gitFileContent = sinon.stub(); | ||
stubs.buildBreadcrumbs = sinon.stub(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
эти переменные - общие для всех тестов на контроллер
тесты не должны использовать общие экземпляры объектов
@@ -0,0 +1,38 @@ | |||
const { expect } = require('chai'); | |||
const sinon = require('sinon'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
круто, что получилось разобраться с библиотекой sinon.js
content | ||
}); | ||
} else { | ||
next(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
кажется, во время рефакторинга сломалась 404 ошибка, если запросить несуществующий путь
const path = req.params[0].split('/').filter(Boolean); | ||
const path = req.params[0].split('/').filter(Boolean).join('/'); | ||
|
||
const content = await _gitFileTree(hash, path).then( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь смешиваются промисы и async/await
лучше придерживаться одного синтаксиса
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
еще, кажется, если при получении контента произойдет 500 ошибка, то все равно вызовется render
(из 19 строки)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
кстати, на ошибку при получении контента из git тоже можно было написать тест
|
||
describe('Контроллер содержимого файла коммита', () => { | ||
|
||
const request = { params: { hash: '', '0': '' } }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
чтобы создавать заглушки для запроса и ответа express, удобно использовать готовые библиотеки вроде https://www.npmjs.com/package/sinon-express-mock
|
||
const controller = require('../filesController'); | ||
|
||
describe('Контроллер файловой системы коммита', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь те же ошибки, что и в предыдущем файле
const { buildBreadcrumbs } = require('../utils/navigation'); | ||
|
||
module.exports = async function(req, res, next, ...stubs) { | ||
const _stubs = (stubs && stubs[0]) || {}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
некрасивый костыль - заглушки передаются как массив, хотя это один объект
лучше было переписать на класс или фабрику
@@ -16,26 +17,32 @@ function buildObjectUrl(parentHash, { path, type }) { | |||
} | |||
} | |||
|
|||
module.exports = function(req, res, next) { | |||
module.exports = async function(req, res, next, ...stubs) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
те же ошибки, что и в других контроллерах
@@ -0,0 +1,18 @@ | |||
const assert = require('assert'); | |||
|
|||
module.exports = (hermione, opts) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
круто, что получилось написать плагин для гермионы
it('Переход со списка файлов на вложенную папку', function() { | ||
return this.browser | ||
.url('/files/f135c5ab9197d1d0e3f5d6eb5e3da2a3a2125f3a/') | ||
.assertNavigation('.files__link--tree', '.content--files'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь было бы неплохо проверить, что зашли в ту папку, в которую хотели перейти
"html-reporter": "^2.22.0", | ||
"mocha": "^5.2.0", | ||
"ndb": "^1.0.26", | ||
"nyc": "^13.1.0", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
хорошо, что получилось попробовать настроить code coverage report
it('Количество возвращаемых элементов соответствует переданным параметрам', () => { | ||
gitHistory(2, 1, executeGit); | ||
|
||
expect(executeGit.getCall(0).args[1][4]).to.be.equal(1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
по записи .args[1][4]
не понятно, что это за данные
лучше присвоить в промежуточную переменную с понятным названием
|
||
describe('Файловая система коммита', () => { | ||
|
||
const executeGit = sinon.stub(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
снова общий stub на все тесты
если запустить тесты по отдельности, они упадут
it('Правильно разбирается история коммитов', async () => { | ||
const history = await gitHistory(1, 1, executeGit); | ||
|
||
expect(history[0]).to.have.all.keys( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
не проверяются значения полей
const executeGit = sinon.stub(); | ||
executeGit.returns(Promise.resolve('1\t2\t3\t4')); | ||
|
||
it('Количество возвращаемых элементов соответствует переданным параметрам', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
насколько я понимаю, в тесте проверяется, что номер и размер страницы корректно прокидываются в git
если так, то название теста не соответствует его смыслу
}); | ||
|
||
it('При выборе папки из коммита, возвращается список файлов этой папки', () => { | ||
const fileTree = gitFileTree('hash', 'path', executeGit); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
название не соответствует содержимому теста
|
||
it('В хлебных крошках присутствует элемент, указывающий на главную страницу', () => { | ||
const breadcrumbs = buildBreadcrumbs(); | ||
expect(breadcrumbs).to.have.lengthOf(1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь не проверяется присутствие элемента history, как указано в названии теста
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dima117, нужно было явно смотреть, что там пришло HISTORY? Я пытался сделать абстрактно, ведь название может изменится.
|
||
it('Последний элемент хлебных крошек никуда не ссылается', () => { | ||
const breadcrumbs = buildBreadcrumbs('hash', 'path/path'); | ||
expect(breadcrumbs[breadcrumbs.length - 1]).to.not.have.property('href'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
в этих тестах вообще не проверяется контент в полученных хлебных крошках
@@ -38,10 +43,10 @@ function gitHistory(page = 1, size = 10) { | |||
'-n', | |||
size | |||
]).then(data => { | |||
return data | |||
return (DEV ? require('./gitHistoryStub') : data) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
это подстановка данных для интеграционных тестов?
если да, то разработчику, который будет это поддерживать трудно будет догадаться, о наличии этой логики
также получается, что в интеграционных тестах не проверяется взаимодействие с git
|
||
const controller = require('../indexController'); | ||
|
||
describe('Контроллер истории коммитов', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь те же ошибки, что и в предыдущем файле
No description provided.