Как получить уникальный jest spy в параллельных тестах?

#typescript #jestjs #mocking #react-hooks #spy

#typescript #jestjs #издевательство #реагирующие хуки #шпион

Вопрос:

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

Это отлично работает для обычных тестов, но при попытке добавить test.concurrent.each , кажется, что шпион является общим для всех тестов, а toHaveBeenCalledTimes устанавливается на количество выполненных тестов.

Я пытался создать уникальный spy для каждого теста, но, похоже, это не имеет значения:

 export const mockLazyQuery = (result: TQueryResult): jest.SpyInstance => {
  const spy = jest.spyOn(Apollo, "useLazyQuery");

  spy.mockImplementationOnce(() => {
    return [jest.fn(), result];
  });
  return spy;
};

  
 import { mockLazyQuery } from "../test-utils";

describe("useHasScope", () => {
  it.concurrent.each([
    [Role.STUDENT, fakeStudent],
    [Role.TRAINER, fakeTrainer],
  ])("should redirect a %s user to the home page", async (role, me) => {
    const querySpy = mockLazyQuery({
      data: { me },
      error: undefined,
      loading: false,
    });
    myIdVar(me.id);
    const wrapper: React.FC = ({ children }) => (
      <MemoryRouter>{children}</MemoryRouter>
    );
    renderHook(() => useHasScope(""), { wrapper });
    expect(querySpy).toHaveBeenCalledTimes(1);   // <== Failing because other tests calling useLazyQuery are running concurrently 
  });
});
  

Есть идеи, как сохранить состояние mock и spy закрытым в тесте и разрешить одновременный запуск нескольких подобных тестов?

Комментарии:

1. Здравствуйте, вы пробовали это: «beforeEach(() => { jest.clearAllMocks(); });» может быть, это решит вашу проблему

2. @Lapach’ У меня есть настройка jest.clearAllMocks() на beforeEach, но это не решает проблему. Моя проблема связана с одновременным запуском тестов и использованием одного и того же шпиона.