Тайм-аут при попытке подключиться к монго из тестов юст-модулей

Я хочу написать несколько модульных тестов со шуткой и mongoose для проверки взаимодействия данных с mongo.

Я не хочу издеваться над мангустом, потому что я специально хочу проверить, как создаются/модифицируются/обрабатываются документы манго.

package.json сконфигурирован так, чтобы оставить модули node незафиксированными:

{
  "jest": {
    "unmockedModulePathPatterns": [
      "node_modules"
    ]
  }
}

В моем фактическом тесте я установил крюк beforeAll(), чтобы позаботиться о подключении к mongo:

const mongoose = require('mongoose');

describe('MyTest', () => {

  beforeAll((done) => {
    mongoose.connect('mongodb://127.0.0.1:27017/test');

    let db = mongoose.connection;

    db.on('error', (err) => {
      done.fail(err);
    });

    db.once('open', () => {
      done();
    });
  });

  it('has some property', () => {
    // should pass but actually never gets run
    expect(1).toBe(1);
  });
});

Здесь вывод:

/usr/local/bin/node node_modules/jest-cli/bin/jest.js --verbose
Using Jest CLI v0.10.0, jasmine2
 FAIL  src/lib/controllers/my-controller/__tests__/my-test.js (5.403s)
MyTest
  ✕ it has some property

MyTest › it has some property
  - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
        at Timer.listOnTimeout (timers.js:92:15)
1 test failed, 0 tests passed (1 total in 1 test suite, run time 5.903s)

Process finished with exit code 1

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

Когда я запускаю аналогичный код вне среды шутки, он соединяется, как и ожидалось (почти мгновенно). Подозревая, что это может вызвать проблемы, я экспериментировал с отключением функции автомата jest полностью, но поведение остается неизменным.

Я предполагаю, что я пропустил что-то невероятно очевидное... любые идеи, что может происходить?

  • jest-cli v. 0.10.0
  • mongoose v. 4.4.11

Обновление:

  • Пробная замена синтаксиса функции ES6 arrow с простым function(done) {}. Никакой разницы.
  • Попробовал выполнить асинхронный тест, передав параметр done и вызвав его при завершении теста. Никакой разницы.
  • Пробовал вызов mongoose.connect() после объявления error и connected обработчиков событий
  • Пробовал комментировать весь связанный с мангустом код, чтобы проверить, что крюк beforeAll() работает правильно - это.

Ответ 1

Жест-жасмин отличается от Jasmine.
Синтаксис, который вы использовали, фактически принадлежит Jasmine 2.0+, а не Jest-jasmine. Поэтому, если вы хотите продолжать использовать шутки, вы должны посмотреть в jest docs, чтобы найти ответ.
Более того, "beforeAll" не является стандартным шумом, вводимым в переменные, см. jest api.

Я получил ваш код с Jasmine 2.3.4, он работает отлично. Я попробовал Promise/pit в шутку, чтобы закончить эту работу, но не смог.

Сначала установите жасмин.

npm install -g jasmine
mkdir jasmine-test  
cd jasmine-test
jasmine init
jasmine examples
touch spec/mongodbspec.js

Вот моя структура каталогов:

fenqideMacBook-Pro:jasmine-test fenqi$ ls -R
.:
spec/

./spec:
mongodbspec.js  support/

./spec/support:
jasmine.json

Затем, отредактируйте spec/mongodbspec.js, я просто добавлю одну строку "'use strict';" в ваш код.

'use strict';

const mongoose = require('mongoose');

describe('MyTest', () => {

  beforeAll((done) => {
    mongoose.connect('mongodb://127.0.0.1:27017/test');

    let db = mongoose.connection;

    db.on('error', (err) => {
      done.fail(err);
    });

    db.once('open', () => {
      done();
    });
  });

  it('has some property', () => {
    // should pass but actually never gets run
    expect(1).toBe(1);
  });
});

Наконец, запустите 'jasmine':

fenqideMacBook-Pro:jasmine-test fenqi$ jasmine
Started
.


1 spec, 0 failures
Finished in 0.023 seconds