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 个选择:
- 您使有效的用户模块无效,将其从缓存中移除
- 您为您的用户使用 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
时都会收到不同的电子邮件。
我正在创建一个 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 个选择:
- 您使有效的用户模块无效,将其从缓存中移除
- 您为您的用户使用 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
时都会收到不同的电子邮件。