В Jest, есть ли способ заставить блок beforeAll / beforeEach запускаться до утверждений при использовании функции для генерации блоков description / it? - PullRequest
0 голосов
/ 24 октября 2018

При использовании функции для генерации describe / it блоков, которые часто используются в тестовом файле, блоки beforeAll или beforeEach, которые существуют в родительском describe, игнорируются.

Например:

const repeatedTests = (num) => {
  // DOES NOT WORK - num is undefined
  describe(`Testing number ${num}`, () => {
    it('should exist', () => {
      expect(num).toBeDefined();
    });
    it('should be a number', () => {
      expect(num).not.toBeNaN();
    });
    it('should be less than 5', () => {
      expect(num).toBeLessThan(5);
    });
  });
};

describe.each([[1],[2],[3]])('Describe for %i', (num) => {
  let numForTesting;
  beforeAll(() => {
    numForTesting = num;
  });
  repeatedTests(numForTesting);
});

Я понимаю, почему это так - repeatedTests запустится немедленно, так как это не describe / it, что бегун тестаследя за.

Чтобы заставить это работать, мне нужно сделать что-то вроде этого:

const repeatedTests = (num) => {
  describe(`Testing number ${num}`, () => {
    let numForTesting;
    beforeAll(() => {
      numForTesting = num;
    });
    it('should exist', () => {
      expect(numForTesting).toBeDefined();
    });
    it('should be a number', () => {
      expect(numForTesting).not.toBeNaN();
    });
    it('should be less than 5', () => {
      expect(numForTesting).toBeLessThan(5);
    });
  });
};

describe.each([[1],[2],[3]])('Describe for %i', (num) => {
  repeatedTests(num);
});

В конкретном наборе тестов, над которым я работаю (который гораздо сложнее, чем этот(в случае, если это не очевидно) - выполнение таких действий усложняет задачу и делает повторное использование функции генератора действительно сложной задачей.

Есть ли способ запустить beforeAll или beforeEach перед блоком тестирования, сгенерированным внутри функции, как в моем первоначальном примере?

Для чего бы то ни было, эквивалент установки num в моем простом примере выше mount с использованием узла реакции с использованием enzyme.

1 Ответ

0 голосов
/ 24 октября 2018

Есть ли способ запустить beforeAll или beforeEach перед тестовым блоком, сгенерированным внутри функции, как в моем оригинальном примере?

По той причине, которую вы упомянули, я чувствую, что ответ - нет.

Вот другой подход, который может сделать то, что вам нужно.Он использует функцию generateState вместо шутки.

const repeatedTests = (generateState) => {

    const num = generateState();

    describe(`Testing number ${num}`, () => {
        it('should exist', () => {
            expect(num).toBeDefined();
        });
        it('should be a number', () => {
            expect(num).not.toBeNaN();
        });
        it('should be less than 5', () => {
            expect(num).toBeLessThan(5);
        });
    });
};

describe.each([[1], [2], [3]])('Describe for %i', (num) => {

    const generateState = () => {
        return num;
    }

    repeatedTests(generateState);
});

Это тестовый вывод:

 PASS  ./index.test.js
  Describe for 1
    Testing number 1
      √ should exist (4ms)
      √ should be a number (1ms)
      √ should be less than 5
  Describe for 2
    Testing number 2
      √ should exist
      √ should be a number
      √ should be less than 5 (1ms)
  Describe for 3
    Testing number 3
      √ should exist
      √ should be a number (1ms)
      √ should be less than 5
...