Я занимался этой проблемой некоторое время, и я не могу заставить существующие решения работать для меня.
У меня есть API Node.js, написанный в Express.js. Я пишу тесты для API, используя Mocha, Chai и Supertest. Эти тесты в основном являются интеграционными тестами.
Один тест может выглядеть так:
it('should fail to register a new user without the proper information', function(done) {
api.post('/user')
.send({})
.expect(400)
.expect('Content-Type', /json/)
.end(function(err, res) {
should.exist(res.body);
should.exist(res.body.error);
should.not.exist(err);
res.body.error.should.contain('Username');
res.body.error.should.contain('password');
done();
});
});
Фактические тесты отлично работают, но теперь мне нужно иметь возможность просматривать охват кода этими тестами. Я должен знать, что я недостаточно тестирую. Я пробовал использовать тестовое покрытие Mocha:
mocha -R html-cov --coverage > coverage.html
и Стамбула:
istanbul cover _mocha -- -R spec --timeout 5000
Оба из них страдают от одной и той же проблемы:
Вы видите, это пример маршрута (регистрация пользователя). Мои тесты определенно охватывают его, но поскольку они не называют этот метод напрямую, инструменты покрытия предполагают, что он никогда не называется. В этом проблема - инструменты покрытия кода не захватывают код, который в конечном итоге выполняется.
Я попробовал другое решение - Istanbul Middleware, который, по-видимому, лучше воспринимал информацию (хотя и был хаки). Однако тот же маршрут выглядит следующим образом:
Это явно нежелательно. Наверняка, другие приложения столкнулись с этой проблемой, как они это делают?
Примечание. Я установил jscoverage, чтобы заставить все это работать.
Источники, на которые я смотрел:
https://brianstoner.com/blog/testing-in-nodejs-with-mocha/
http://boycook.wordpress.com/2013/03/29/automated-javascript-testing-with-mocha-and-js-coverage-for-nodejs/
Покрытие кода с помощью Mocha