Skip to content
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

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open

Add unit test and integration test #34

wants to merge 19 commits into from

Conversation

madurmanov
Copy link

No description provided.

'html-reporter/hermione': {
path: 'hermione/hermione-html-report'
},
[path.resolve(__dirname, './hermione/custom-commands/index.js')]: true
Copy link
Owner

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];
Copy link
Owner

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(
Copy link
Owner

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();
Copy link
Owner

@dima117 dima117 Nov 3, 2018

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');
Copy link
Owner

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();
Copy link
Owner

@dima117 dima117 Nov 3, 2018

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(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь смешиваются промисы и async/await
лучше придерживаться одного синтаксиса

Copy link
Owner

@dima117 dima117 Nov 3, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

еще, кажется, если при получении контента произойдет 500 ошибка, то все равно вызовется render (из 19 строки)

Copy link
Owner

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': '' } };
Copy link
Owner

@dima117 dima117 Nov 3, 2018

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('Контроллер файловой системы коммита', () => {
Copy link
Owner

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]) || {};
Copy link
Owner

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) {
Copy link
Owner

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) => {
Copy link
Owner

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');
Copy link
Owner

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",
Copy link
Owner

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);
Copy link
Owner

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();
Copy link
Owner

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(
Copy link
Owner

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('Количество возвращаемых элементов соответствует переданным параметрам', () => {
Copy link
Owner

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);
Copy link
Owner

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);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь не проверяется присутствие элемента history, как указано в названии теста

Copy link
Author

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');
Copy link
Owner

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)
Copy link
Owner

@dima117 dima117 Nov 3, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

также получается, что в интеграционных тестах не проверяется взаимодействие с git

Repository owner deleted a comment from madurmanov Nov 3, 2018

const controller = require('../indexController');

describe('Контроллер истории коммитов', () => {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь те же ошибки, что и в предыдущем файле

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants