工厂尝试创建两个具有相同属性的对象
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()之后),这么多选项!
我正在为实现用户 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()之后),这么多选项!