最初将文档插入DB

时间:2017-02-01 14:57:38

标签: mongoose ava mockgoose

我想用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();
    });
  });
}

0 个答案:

没有答案