Node.js Mocha Testing Restful API Endpoints и покрытие кода

Мне очень нравится Стамбул, и я экспериментирую с другими библиотеками покрытия Node.js, но у меня есть проблема. Почти все мои модульные тесты представляют собой HTTP-вызовы моего API, например:

    it('should update the customer', function (done) {
        superagent.put('http://myapp:3000/api/customer')
            .send(updatedData)
            .end(function (res) {
                var customer = res.body;
                expect(res.statusCode).to.equal(200);
                expect(customer.name).to.equal(updatedData.name);
                done();
            });
    });

В отличие от фактического запроса файла customers.js и прямого вызова updateCustomer. Для меня тестирование конечной точки имеет гораздо больший смысл, поскольку оно проверяет не только updateCustomer, но также маршруты, контроллеры и все остальное, что связано с этим.

Это работает нормально, но проблема в том, что я не вижу способа, чтобы какой-либо инструмент покрытия кода распознал эти тесты. Есть ли способ у Стамбула или чего-то еще, чтобы распознать эти тесты Mocha? Если нет, то в чем заключается соглашение? Как вы тестируете конечные точки и по-прежнему используете инструменты покрытия кода?


person KJ3    schedule 12.08.2015    source источник


Ответы (1)


Проблема в том, что вы используете superagent, тогда как для написания модульных тестов вы должны использовать supertest. Если вы используете supertest, istanbul будет правильно отслеживать покрытие кода.

Пример кода для начала:

'use strict';

var chai = require('chai').use(require('chai-as-promised'));
var expect = chai.expect;
var config = require('../../config/config');
var request = require('supertest');

var app = require('../../config/express')();

describe('Test API', function () {
  describe('test()', function() {
    it('should test', function(done) {
      request(app)
        .get('/test')
        .query({test: 123})
        .expect('Content-Type', /json/)
        .expect(200)
        .end(function(err, res){
          expect(err).to.equal(null);
          expect(res.body).to.equal('whatever');
          done();
        });
    });

    it('should return 400', function(done) {
      request(app)
        .get('/test/error')
        .query({})
        .expect('Content-Type', /json/)
        .expect(400, done);
    });
  });
});
person Yuri Zarubin    schedule 12.08.2015
comment
Строка с require('../../config/express')() должна загружать весь код сервера? Это как Стамбул считает, где находится код сервера? Спасибо! - person sakovias; 21.12.2016
comment
Исходный код действительно выполнял var app = require('./config/express')(config);, это была функция, которая возвращала экспресс-экземпляр с заданным объектом конфигурации. Вместо этого вы можете просто сделать var app = express(); . - person Yuri Zarubin; 21.12.2016