Javascript Factory尝试创建具有相同特性的两个对象

Javascript Factory尝试创建具有相同特性的两个对象,javascript,node.js,express,jestjs,faker,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(),

我正在为实现用户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()
,对吗?错误的在其中一个测试套件中,我需要两个用户,一个是admin,另一个不是。所以我写了这个设置/拆卸:

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=await factory.create(…)
运行正常,但
admin=await factory.create(…)
会引发一个
MongoError:E11000重复键错误集合

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

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

编辑:根据建议,我使用
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,了解如何使工厂为创建的每个对象运行一些代码


或者只需传递函数faker.internet.email,而不使用()我认为factory girl每次也会调用该函数,您还可以让您的define调用使用一个返回此对象的函数(在调用faker.internet.email()之后),有这么多选项

现在一切正常。将与工作工厂一起编辑,谢谢!