npm Module Faker 在调用时不会创建不同的数据

npm Module Faker not creating different data when called

我正在创建一个 API 测试框架并使用 faker 创建假用户到 post 到 API。

我正在测试两个端点,创建用户和创建提醒,我 POST 向这两个端点发送数据。

要创建用户,我需要 post 用户端点的名称、电子邮件和密码,然后我会取回有效的 JWT。

要创建提醒,我需要一个有效的 JWT,我在创建提醒调用的 header 中 post。

我有一个帮助函数,可以为我创建一个用户 json object,我在创建用户和创建提醒端点中都使用了它。

如果我运行 单独进行每个测试,测试就会通过。但是,如果我尝试 运行 我的全套测试,我的验证在创建用户端点上失败,因为电子邮件已经存在,它是在我调用创建提醒时创建的(因为这也会调用创建用户来获取有效令牌)

这是我创建有效用户的测试 -

const validUser = require('../data/userData/validUser');

describe('Functional Testing', () => {
  describe('Users', () => {
    it('It should create a user', async () => {
      const response = await usersService.createUser(validUser);
      expect(response.statusCode).to.equal(200);
      expect(response.body).to.not.be.null;
      expect(response.body).to.have.deep.property('token');
    });
  });
});

这里是使用token用户服务的提醒测试

context('Functional Testing', () => {
  describe('Reminder', () => {
    it.skip('It should create a reminder', async () => {
      const createUserResponse = await user.createUser(validUser);
      const token = createUserResponse.body.token;

      const response = await reminderService.createReminder(
        validReminder,
        token
      );

      expect(response.statusCode).to.equal(201);
      expect(response.body).to.have.deep.property('success');
      expect(response.body).to.deep.include({ success: 'reminder created' });
    });

这是我创建用户的模块 -

const faker = require('faker');

module.exports = {
  name: 'Test User',
  email: `${faker.internet.email()}`,
  password: '123123'
};

我原以为无论如何,createUser 模块总是会为我创建一封随机电子邮件,但我认为测试可能 运行 快速让 faker 生成一封新的随机电子邮件?

如何让 Faker 始终生成随机用户?

您至少有 2 个选择:

  1. 您使有效的用户模块无效,将其从缓存中移除
  2. 您为您的用户使用 getter

正在使模块失效

一个模块可以被要求十几次,但它只会导出一次。任何带有它的数据都会执行一次,包括伪造的电子邮件。

但是,使用 CommonJS,您可以从缓存中删除模块:

const vuPath = require.resolve('../data/userData/validUser');
console.log(require(vuPath));
console.log(require(vuPath));
// same result ... now
delete require.cache[vuPath];
console.log(require(vuPath));
// different email

这要求您每次都使用户无效,或者您拆除无效并在设置时重新分配 validUser

使用 getter

const faker = require('faker');

module.exports = {
  name: 'Test User',
  get email() { return faker.internet.email(); },
  password: '123123'
};

在这种情况下,用户每次访问 user.email 时都会收到不同的电子邮件。