Mocha + Chai тестирует схемы моделей Mongoose, имеющие проблемы с метками времени - PullRequest
0 голосов
/ 25 сентября 2019

Я тестирую свое экспресс-приложение, которое использует 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 за его комментарий и помощь!

1 Ответ

1 голос
/ 26 сентября 2019

Добавление этого в качестве ответа, поскольку вы не должны отвечать в комментариях.

Я только догадываюсь, но FakeDate, скорее всего, от TimeKeeper.Попробуйте запустить без заморозки, и я уверен, что ошибка исчезнет

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