0

我想用猫鼬测试一个快速应用程序。因此我使用 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 钩子更改为 after 钩子,它会起作用,但我认为这不是应该的方式吗?我认为应该在每次测试后而不是在所有测试后重置数据库。

似乎 beforeEach 钩子只在第一次调用它时创建我的用户,然后就不再工作了..

这是我的数据库助手:

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();
    });
  });
}
4

0 回答 0