Тайм-аут при попытке подключиться к монго из тестов юст-модулей
Я хочу написать несколько модульных тестов со шуткой и 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