#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, но это не решает проблему. Моя проблема связана с одновременным запуском тестов и использованием одного и того же шпиона.