Chai / Supertest не пройден для асинхронного RESTful маршрута - PullRequest
0 голосов
/ 31 января 2019

Я в отчаянии, я реализовал простой сервис RESTful на основе NodeJS / ExpressJS и попытался написать интеграционный тест с mocha и chai/chai-http для него.Один из реализованных маршрутов создает проблемы, тест все равно не выполняется из-за превышения времени ожидания.Если я получаю доступ к этому маршруту вручную с помощью моего клиента RESTful, кажется, что все работает!

Сообщение об ошибке от mocha:

Error: Timeout of 100000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\...\tests\index.js)

Что уже работает:

  • Вручнуюдоступ по маршруту (см. выше) через RESTful-клиент
  • Проверка других маршрутов с помощью методов GET, например
  • Проверка маршрута (см. выше), если отправляется ответ с фиктивной полезной нагрузкой до часть запроса mongoose / database

Ни успешный обратный вызов Promise внутри теста не вызывается с объектом ответа, ни произошла ошибка!Тем не менее тайм-аут теста превышен, и мокко его убивает.

Это маршрут, реализованный как часть службы:

router.post('/signup', function(request, response, next) {

    let user = new User(request.body);

    user.password = User.hashProperty(user.password); // Store password as hash

    User.create(user).then((newUser) => {

        return response.formatter.resolve(newUser.toPrivateJSON(), 201);

    }).catch((error) => {

        console.log('error');
        return next(error);
    });
});

А вот тест, основанный на мокко и чае:

describe('/api/users/signup', function() {

    it('Should create a new user account', function(done) {

        this.timeout(100000);

        let user = {

            name: 'User',
            email: 'user@web.de',
            password: 'abc123'
        }

        chai.request(app)
        .post('/api/users/signup')
        .send(user)
        .then((response) => {

            response.should.have.status(201);
            done();
        })
        .catch((error) => {

            return done(error);
        });
    });
});

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

РЕДАКТИРОВАТЬ 01/31/2019

После замены chai/chai-http на supertest поведение не меняется.Также после замены библиотеки тестирование маршрута все равно не прошло.Как я и догадался, проблема, похоже, заключается в асинхронном маршруте или асинхронном доступе mongoose.

По соображениям целостности здесь приведен интеграционный тест, написанный на supertest:

describe('/signup', function() {

    it('Should create a new user account', function() {

        let user = {

            name: 'User',
            email: 'user@web.de',
            password: 'abc123'
        };

        return supertest(app)
        .post('/api/users/signup')
        .set('Accept', 'application/json')
        .send(user)
        .then((response) => {

            assert.strictEqual(response.status, 201);
        });
    });
});

Понятия не имеюкак я успешно провожу интеграционный тест!Есть идеи?

РЕДАКТИРОВАТЬ 01/31/2019

В другом посте Я нашел полезную подсказку и, похоже, локализовал проблему!Проблема в том, что перед интеграционным тестом запустите модульное тестирование модели мангуста, и этот тест уже установил соединение мангусты!Если я закомментирую этот модульный тест, мой тест на интеграцию (см. Выше) работает.Как я могу управлять / делиться подключением?Поскольку первое соединение для модульного теста открывается вручную (см. Ниже), а второе соединение открывается внутри app как часть службы.

Первое соединение открыто для целей тестирования модели (tests/models/article.js):

before((done) => {

    mongoose.connect(process.env.DATABASE_PATH || 'mongodb://localhost/natter-dev',
        {useNewUrlParser: true, useFindAndModify: false, useCreateIndex: true});

    mongoose.connection.once('open', done);
    mongoose.connection.on('error', (error) => {

        console.error.bind(console, error);
    });
});

Второе соединение как часть службы (app.js):

...
// Establishes the mongo database connection

mongoose.connect(config.database.path,
    {useNewUrlParser: true, useFindAndModify: false, useCreateIndex: true}, (error) => {

    if(error) {

        throw error;
    }
});

module.exports = app;

Импортируется с помощью интеграционного теста (см. Выше) через const app = require('../../app'); Выполнениеоба фрагмента кода, кажется, приводят к моей проблеме, потому что мангуст соединение с одной и той же базой данных открывается дважды!

1 Ответ

0 голосов
/ 31 января 2019

После завершения теста вы должны закрыть соединение с базой данных и экспресс-сервером.Просто напишите код в блоке afterAll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...