npm Module Faker не создает разные данные при вызове

Я создаю тестовую среду API и использую фейкер для создания поддельных пользователей для публикации в API.

Я тестирую две конечные точки, создаю пользователя и создаю напоминание, я отправляю данные в обе из них.

Чтобы создать пользователя, мне нужно опубликовать имя, адрес электронной почты и пароль на конечной точке пользователя, и я получу действительный JWT.

Чтобы создать напоминание, мне нужен действительный JWT, который я публикую в заголовке вызова создания напоминания.

У меня есть вспомогательная функция, которая создает для меня пользовательский json-объект, и я использую ее как в конечной точке создания пользователя, так и в конечной точке создания напоминания.

Если я запущу каждый тест отдельно, тест будет пройден. Однако, если я попытаюсь запустить полный набор тестов, моя проверка завершится ошибкой в ​​конечной точке создания пользователя, потому что электронное письмо уже существует, оно было создано, когда я вызвал напоминание о создании (поскольку это также вызывает создание пользователя для получения действительного токена)

Вот мой тест для создания действительного пользователя -

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');
    });
  });
});

Вот тест напоминания о том, что пользователи используют пользовательский сервис для токена

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 всегда генерировать случайного пользователя?


person Kpizzle    schedule 03.09.2019    source источник


Ответы (1)


у вас есть как минимум 2 варианта:

  1. вы аннулируете действительный пользовательский модуль, удаляя его из кеша
  2. вы используете геттер для своего пользователя

Аннулирование модуля

Модуль может потребоваться десятки раз, но он будет экспортирован только один раз. Любые данные с ним будут выполнены один раз, включая поддельное электронное письмо.

Однако с 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 при настройке.

Использование геттера

const faker = require('faker');

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

В этом случае каждый раз при доступе к user.email у пользователя будет другой адрес электронной почты.

person Andrea Giammarchi    schedule 03.09.2019
comment
Большое спасибо! Я решил использовать вариант геттера, так как это сделало мой код чище и легче для чтения. Я только начинаю писать javascript. Могу я спросить, откуда вы это знаете, я просмотрел фальшивые документы и не увидел этого. Или это общий javascript? - person Kpizzle; 04.09.2019