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

Factory tries to create two objects with same properties

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

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(),对吗?错误的。在其中一个测试套件中,我需要两个用户,一个是管理员,另一个不是。所以我写了这个setup/teardown:

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 duplicate key error collection.

这是因为工厂尝试使用已在使用的电子邮件创建用户(电子邮件对于模型用户是唯一的)。我可以通过以与传递 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 每次也会调用那个函数,你也可以让你的定义调用接受一个函数 returns 这个对象(在调用faker.internet.email()之后),这么多选项!