Я тестирую свое экспресс-приложение, которое использует Mongoose
ORM для обработки mongodb, но я столкнулся с небольшой проблемой при тестировании.
Я попробовал следующее:
const bcrypt = require('bcryptjs');
const { Schema, model } = require('mongoose');
const schema = new Schema({
password: String,
email: String,
}, {
timestamps: true
});
schema.pre('save', function (next) {
const admin = this;
if (admin.isModified('password')) {
admin.password = bcrypt.hashSync(admin.password, 8);
}
next();
});
schema.methods.verifyPassword = function (password) {
return bcrypt.compareSync(password, this.password);
};
module.exports = model('Admin', schema);
Наряду с тестом mocha + chai следующей конфигурации для запуска теста mocha
process.env.DATABASE_URL = 'localhost:27017'
process.env.DATABASE_NAME = 'funtime'
process.env.NODE_ENV = 'test'
const chai = require('chai')
const chaiHttp = require('chai-http')
const chaiThings = require('chai-things')
const timekeeper = require('timekeeper')
const mongoose = require('mongoose')
chai.use(chaiThings)
chai.use(chaiHttp)
chai.should()
// Clearing DB function for beforeEach on tests
const clearDB = (callback) => {
console.log('clearing dbs...')
for (let i in mongoose.connection.collections) {
mongoose.connection.collections[i].deleteMany(() => {})
}
return
}
const now = new Date()
now.setHours(10)
now.setMinutes(0)
now.setSeconds(0)
now.setMilliseconds(0)
timekeeper.freeze(now)
require('./factory')
console.log('Tests starting...')
before(() => {
require('../lib/config/db')
})
after((done) => {
timekeeper.reset()
clearDB()
console.log('Tests done!')
done()
})
Я использую Docker и docker compose для запуска моего экспресс-сервера и экземпляра mongodb, поэтому необходима переменная env.
в строке на before(() => {})
, мне потребовалась моя конфигурация db
, которая имеет следующее:
const mongoose = require('mongoose');
const { mongoose: mongooseConfig } = require('./index');
const connectWithRetry = () => {
console.log('Retrying Mongodb connection');
mongoose.connect(mongooseConfig.uri, mongooseConfig.options)
.then(() => console.log('Connected to MongoDB...'))
.catch((err) => {
console.log(`Could not connect to MongoDB: ${err}:${err.stack}`);
setTimeout(connectWithRetry, 5000);
});
};
connectWithRetry();
process.on('SIGINT', () => {
mongoose.connection.close(() => {
console.log('Mongoose default connection disconnected due to app termination');
process.exit(0);
});
});
Я получаю ошибку, как при запуске команды ./node_modules/.bin/mocha \"./tests/**/*.js\" --timeout 10000 --exit
:
Invalid schema configuration: `FakeDate` is not a valid type at path `updatedAt`.
Не уверен, что здесь не так
РЕДАКТИРОВАТЬ (решено)
При удалении timekeeper
проблема решена.Спасибо @jeffheifetz за его комментарий и помощь!