Javascript Factory尝试创建具有相同特性的两个对象
我正在为实现用户CRUD的express应用程序编写测试。在编写集成测试之前,我创建了一个工厂,为测试创建用户: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(),
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()之后),有这么多选项 现在一切正常。将与工作工厂一起编辑,谢谢!