首页 > 解决方案 > 节点JS | 开玩笑| 工厂女孩 | Faker:Faker 生成相同的值

问题描述

我正在开发一个 Node.js API,现在我正在使用supertest为所有路由创建测试。

我发现最好的做法是使用factory-girlfaker为模型生成随机值。

知道了这一点,我创建了factory.js

  import faker from 'faker/locale/pt_BR';
  import { factory } from 'factory-girl';

  import User from '../src/app/models/User';

  factory.define('User', User, {
    name: faker.name.findName(),
    email: faker.internet.email(),
    password: faker.internet.password(),
  });

  export default factory;

当我执行一次时,它的作品很漂亮:

  it('should be able to register', async () => {
    const user = await factory.attrs('User');

    const response = await request(app)
      .post('/users')
      .send(user);

    expect(response.body).toHaveProperty('id');
  });

const user = await factory.attrs('User'); 返回以下模型:

  {
    name: 'Sra. Dalila Pereira',
    email: 'Jlia68@bol.com.br',
    password: 'zhpMclO9KwWfhlt'
  }

但是如果我两次调用相同的指令,模型将是相等的:

  it('should return all users', async () => {
    const user1 = await factory.attrs('User');

    await request(app)
      .post('/users')
      .send(user1);

    const user2 = await factory.attrs('User');

    await request(app)
      .post('/users')
      .send(user2);

    const response = await request(app)
      .get('/users')
      .set('Authorization', `Bearer ${token}`);

    expect(response.status).toBe(200);
  });

型号:user1

   {
     name: 'Salvador Costa',
     email: 'Warley.Braga@hotmail.com',
     password: 'Q4EfvNJv9zulONR'
   }

型号:user2

   {
     name: 'Salvador Costa',
     email: 'Warley.Braga@hotmail.com',
     password: 'Q4EfvNJv9zulONR'
   }

因此,当调用第二个帖子时会发生错误,因为用户已经存在。

你知道我能做些什么来解决这个问题吗?

谢谢

标签: node.jsjestjsfactoryfaker.js

解决方案


文档提供了此示例:

// Using objects as initializer
factory.define('product', Product, {
  // use sequences to generate values sequentially
  id: factory.sequence('Product.id', (n) => `product_${n}`),

  // use functions to compute some complex value
  launchDate: () => new Date(),
  // ...
})

launchDate字段是按调用计算的。

伪造者也应该如此。为了保证每次都有一个新鲜的值,尝试提供一个箭头函数。

factory.define('User', User, {
  name: () => faker.name.findName(),
  email: () => faker.internet.email(),
  password: () => faker.internet.password(),
});

推荐阅读