• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jest, React testing library - mocki się nie resetują

+1 głos
405 wizyt
pytanie zadane 20 marca 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)

Cześć, piszę testy do aplikacji w nextjs:

import ContactsFirstPageResponse from '@mocks/contacts/firstPage.json';
import ContactsSecondPageResponse from '@mocks/contacts/secondPage.json';
import ContactsEmptyResponse from '@mocks/contacts/empty.json';

const spy = jest.spyOn(axios, 'get');

describe('Contacts', () => {
	afterEach(() => {
        // tutaj sprawdzałem różne możliwości resetowania mocków, ale żadna nie działa
		spy.mockReset();
		spy.mockClear();
		spy.mockRestore();
		jest.clearAllMocks();
		jest.restoreAllMocks();
		jest.resetAllMocks();
	});

	it('show empty list component', async () => {
		spy.mockResolvedValue(ContactsEmptyResponse);

		// ...
	});

	it('render 10 contacts and fetch 10 more on click', async () => {
		spy.mockResolvedValue((url: string) => {
			if (url.includes('?page=1')) {
				return ContactsFirstPageResponse;
			} else {
				return ContactsSecondPageResponse;
			}
		});

		// ...
	});
});

Jest config:

const nextJest = require('next/jest');

const createJestConfig = nextJest({
	dir: './',
});

const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig');

const customJestConfig = {
	setupFilesAfterEnv: ['<rootDir>/jest-setup.js'],
	moduleDirectories: ['node_modules', '<rootDir>/'],
	testEnvironment: 'jest-environment-jsdom',
	moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
	clearMocks: true,
};

module.exports = createJestConfig(customJestConfig);

 

Problem polega na tym, że pierwszy test dostaje response z pliku ContactsEmptyResponse (i test przechodzi, czyli wszystko ok), ale już drugi test również dostaje ContactsEmptyResponse zamiast ContactsFirstPageResponse lub ContactsSecondPageResponse

1
komentarz 20 marca 2022 przez Bakkit Dyskutant (7,600 p.)
A ten głos w dół za?
komentarz 20 marca 2022 przez ScriptyChris Mędrzec (190,170 p.)

@Bakkit, sprawdź tymczasowo czy użycie mockResolvedValueOnce (zamiast mockResolvedValue) pomoże.

1 odpowiedź

0 głosów
odpowiedź 20 marca 2022 przez Wiciorny Ekspert (283,500 p.)
edycja 20 marca 2022 przez Wiciorny

Ustaw dla JASMINE setUpState i before-each. Nie resetują się, bo działasz na testaach w ramach 1 "case"- jednego bloku wykonywalnego.

describe('Contacts', () =>

to jest jeden kontekst wywołania, więc stan w zakresie tego kontekstu, testy mają ten sam stan i obiekt.
https://jasmine.github.io/tutorials/your_first_suite
poczytaj o ustawianiu stanu i wykonywaniu 
generalnie mimo, że before i after działa w zakresie każdego "it-> case" 
https://stackoverflow.com/questions/51534192/aftereach-and-beforeeach-only-for-describes
to istnieje istotna różnica 
After zresetuje się po wykonaniu wszystkich  TESTÓW. 
W tym co napisałeś 

const spy = jest.spyOn(axios, 'get');

spy- obiekt jest ustawiany tylko raz 

dodaj do twojej metody after each 
 

spy.calls.reset();

 

Podobne pytania

+1 głos
0 odpowiedzi 291 wizyt
pytanie zadane 10 marca 2021 w JavaScript przez poldeeek Mądrala (5,980 p.)
0 głosów
0 odpowiedzi 247 wizyt
0 głosów
2 odpowiedzi 417 wizyt
pytanie zadane 5 czerwca 2021 w JavaScript przez poldeeek Mądrala (5,980 p.)

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,369 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...