javascript - 工厂尝试创建两个具有相同属性的对象

标签 javascript node.js express jestjs faker

我正在为实现用户 CRUD 的 Express 应用程序编写测试。在编写集成测试之前,我创建了一个工厂来为测试创建用户:

factories.js

import faker from 'faker';
import { factory } from 'factory-girl';

import User from '../../src/app/models/User';

factory.define('User', User, {
  name: faker.name.firstName(),
  email: faker.internet.email(),
  password: faker.internet.password(),
  admin: false,
});

export default factory;

不错。现在,每当我需要创建一个用户进行测试时,我只需要使用factory.create(),对吧?错误的。在其中一个测试套件中,我需要两个用户,一个是管理员,另一个不是。所以我写了这个设置/拆卸:

let user, admin; 

const createUsers = async () => {
  // Runs ok 
  user = await factory.create('User');

  // Error
  admin = await factory.create('User', { admin: true });
};

const removeUsers = async () => {
  await user.remove();
  await admin.remove();
};

beforeAll(async () => {
  await createUsers();
});

afterAll(async () => {
    await removeUsers();
    mongoose.connection.close();
});

user = waitfactory.create(...) 运行正常,但 admin = waitfactory.create(...) 引发 MongoError: E11000重复键错误集合.

这是因为工厂尝试使用已在使用的电子邮件创建用户(电子邮件对于模型用户来说是唯一的)。我可以通过以与传递 admin: true 相同的方式将特定电子邮件传递给 create 方法来确保不会发生这种情况,但这没有多大意义,因为我创建了工厂来避免这种情况有点麻烦。

你们能指出我在这里做错了什么吗?我想这和我定义工厂的方式有关。提前致谢。

编辑:按照建议,我使用factory.sequence修复了它。

factory.define('User', User, {
  name: factory.sequence('User.name', () => faker.name.firstName()),
  lastName: factory.sequence('User.lastName', () => faker.name.lastName()),
  email: factory.sequence('User.email', () => faker.internet.email()),
  password: factory.sequence('User.password', () => faker.internet.password()),
  redefinePassword: false,
  admin: false,
});

最佳答案

虽然 faker.internet.email() 每次被调用时都会创建一个新的假电子邮件,但在为工厂定义模板对象时只调用它一次。查看factory.sequence API,寻找一种让工厂为创建的每个对象运行一些代码的方法https://www.npmjs.com/package/factory-girl#defining-factories

或者简单地传递函数faker.internet.email,没有(),我认为factory-girl每次也会调用该函数,你也可以让你的定义调用采用一个返回该对象的函数(在调用faker.internet.email()),这么多选项!

关于javascript - 工厂尝试创建两个具有相同属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61567023/

相关文章:

javascript - 我的 socket.io 客户端出现 io not defined 错误

node.js - 使用NodeJS删除数据库中的多个用户

javascript - 如何在 PHP 中为 HTML 标签创建自定义函数?

javascript - 使用 python 或 javascript 从文本中提取困难的英语单词以构建词汇

javascript - 停止 IE/Edge 窗口调整为 iframe 尺寸

javascript - 将变量从 javascript 传递到 ejs

json - 在 Node + express + Jade 中将对象传递给客户端?

javascript - 对 jQuery 数据表中所有选定的行求和

node.js - Angular/TypeScript 编译的初学者问题

node.js - 我可以在 Node.js 启动时运行多个 js 脚本吗