我想用mongoose测试一个快速应用程序。因此我使用的是AVA和Mockgoose。
使用AVA的beforeEach挂钩我想在我的数据库中插入两个文档,然后我可以在我的测试中使用它。
代码如下所示:
import test from 'ava';
import request from 'supertest';
import app from '../../../index';
import { connectDB, dropDB } from '../../utils/tests-helper';
import User from '../user.model';
const users = [
new User({ username: 'test1', email: 'test1@test.de', password: '1234'}),
new User({ username: 'test2', email: 'test2@test.de', password: '5678'}),
];
test.cb.beforeEach('Connect and add two users', t => {
connectDB(t, () => {
User.create(users, (err, user) => {
if (err) t.fail('Unable to create users');
t.end();
});
});
});
然后我进行了这项测试,以确保上面的代码有效:
test.serial('Should find the initially added users', async t => {
t.plan(2);
const firstUser = await User.findOne({ username: 'test1' }).exec();
t.is(firstUser.username, 'test1');
const secondUser = await User.findOne({ username: 'test2' }).exec();
t.is(secondUser.username, 'test2');
});
此测试也成功并且正常工作。 在这个测试之后,我有另一个测试:
test.serial('Should return a 200 status when user loggs in', async t => {
t.plan(1);
//just for debugging
User.findOne({email: 'test1@test.de'}, function(err, user) {
console.log(user); //returns null
});
//just for debugging
User.find({}, function(err, user) {
console.log(user); //returns []
});
const res = await request(app)
.post('/api/users/authenticate')
.send({email: 'test1@test.de', password: '1234'});
t.is(res.status, 200);
});
当我切换测试的顺序时,它仍然适用于第一个测试,而第二个测试失败。 因此,对于第一次测试,我的数据确实存在,而第二次测试则没有。这是为什么?为什么它在第一次测试中有效?
如果我将afterEach挂钩更改为后挂钩,它可以正常工作,但我认为这不是应该的方式吗?我认为数据库应该在每次测试后重置,而不是在所有测试之后重置。
看起来像beforeEach钩子只在第一次调用它时才创建我的用户然后再不起作用..
这是我的DB助手:
import mongoose from 'mongoose';
import mockgoose from 'mockgoose';
import config from '../../config/main';
function createMongooseConnection() {
return new Promise((resolve, reject) => {
mongoose.createConnection(config.mongoTestURL, err => {
if (err) return reject('Unable to connect to test database');
return resolve();
});
});
}
export function connectDB() {
return mockgoose(mongoose)
.then(createMongooseConnection);
}
export function dropDB() {
return new Promise((resolve, reject) => {
mockgoose.reset(err => {
if (err) return reject('Unable to reset test database');
return resolve();
});
});
}