我正在为实现用户 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/