Учитывая простую модель Мангуста:
import mongoose, { Schema } from 'mongoose';
const PostSchema = Schema({
title: { type: String },
postDate: { type: Date, default: Date.now }
}, { timestamps: true });
const Post = mongoose.model('Post', PostSchema);
export default Post;
Я хочу протестировать эту модель, но я поражу несколько препятствий.
Моя текущая спецификация выглядит примерно так (некоторые вещи опущены для краткости):
import mongoose from 'mongoose';
import { expect } from 'chai';
import { Post } from '../../app/models';
describe('Post', () => {
beforeEach((done) => {
mongoose.connect('mongodb://localhost/node-test');
done();
});
describe('Given a valid post', () => {
it('should create the post', (done) => {
const post = new Post({
title: 'My test post',
postDate: Date.now()
});
post.save((err, doc) => {
expect(doc.title).to.equal(post.title)
expect(doc.postDate).to.equal(post.postDate);
done();
});
});
});
});
Однако с этим я ударяю свою базу данных каждый раз, когда запускаю тест, чего я бы предпочел избежать.
Я пробовал использовать Mockgoose, но тогда мой тест не будет запущен.
import mockgoose from 'mockgoose';
// in before or beforeEach
mockgoose(mongoose);
Тест застрял и выдает сообщение об ошибке: Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
Я попытался увеличить таймаут до 20 секунд, но это ничего не решило.
Затем я выбросил Mockgoose и попытался использовать Sinon, чтобы заглушить вызов save
.
describe('Given a valid post', () => {
it('should create the post', (done) => {
const post = new Post({
title: 'My test post',
postDate: Date.now()
});
const stub = sinon.stub(post, 'save', function(cb) { cb(null) })
post.save((err, post) => {
expect(stub).to.have.been.called;
done();
});
});
});
Этот тест проходит, но это как-то не имеет для меня никакого смысла. Я совершенно новичок в обучении, насмешливости, что у вас есть, и я не уверен, что это правильный путь. Я обрезаю метод save
на post
, а затем я утверждаю, что он был вызван, но я, очевидно, его называю... Кроме того, я не могу найти аргументы, -stubbed Mongoose метод вернется. Я хотел бы сравнить переменную post
с тем, что возвращает метод save
, как в самом первом тесте, в котором я попал в базу данных. Я пробовал пару методов , но все они чувствуют себя довольно хаки. Должен быть чистый путь, нет?
Пара вопросов:
-
Должен ли я действительно избегать попадания в базу данных, как я всегда читал везде? Мой первый пример отлично работает, и я могу очистить базу данных после каждого запуска. Однако мне это действительно не нравится.
-
Как я закрою метод сохранения из модели Mongoose и убедитесь, что он фактически проверяет, что я хочу проверить: сохранение нового объекта в db.