Подтвердить что ты не робот

Как настроить покрытие кода в моем API на основе Express?

Я занимался этой проблемой некоторое время, и я не могу заставить существующие решения работать для меня.

У меня есть 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

Оба из них страдают от одной и той же проблемы:

https://www.dropbox.com/s/qcgmout6hx91xgs/Screenshot%202014-04-19%2020.42.44.png

Вы видите, это пример маршрута (регистрация пользователя). Мои тесты определенно охватывают его, но поскольку они не называют этот метод напрямую, инструменты покрытия предполагают, что он никогда не называется. В этом проблема - инструменты покрытия кода не захватывают код, который в конечном итоге выполняется.

Я попробовал другое решение - Istanbul Middleware, который, по-видимому, лучше воспринимал информацию (хотя и был хаки). Однако тот же маршрут выглядит следующим образом:

enter image description here

Это явно нежелательно. Наверняка, другие приложения столкнулись с этой проблемой, как они это делают?

Примечание. Я установил 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

4b9b3361

Ответ 1

У меня была такая же точная ситуация, и я обнаружил, что она должна делать так, как я использовал supertest:

  • До того, как я тестировал свое приложение непосредственно против моего работающего сервера, вроде этого.

    var request = require('supertest')
    var api = request('http://127.0.0.1:3000')
    
  • Я исправляю его , требуя моего экспресс-приложения:

    var request = require('supertest')
    var app = require('../../../')
    var api = request(app)
    

Ответ 2

Основываясь на моем опыте с istanbul, я думаю, что может быть логическая ошибка с точки зрения того, какой маршрут фактически используется. Пожалуйста, установите этот тест для использования it.only, а затем посмотрите на покрытие istanbul. (Нет необходимости использовать промежуточное ПО istanbul, так как ваши разработчики имеют доступ к выходу html, который записывается в локальную файловую систему.)

Пожалуйста, покажите, какой маршрут на самом деле покрывается, потому что istanbul очень умен в том, как это следует за операторами.

Если вы нашли ошибку в istanbul, я рекомендую вам размещать там ошибку.