<p>jest.mock рдлрд╝реИрдХреНрдЯрд░реА рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬрдире░ 2017  ┬╖  38рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдХреАрдбрд╝рд╛

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ test рдпрд╛ it рдЕрдВрджрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдореВрд▓ рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдирдХрд▓реА рдХрд╛ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

jest.mock('services/feature', () => ({
    isEnabled: () => true
}));

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреГрдкрдпрд╛ рдЕрдкрдирд╛ рд╕рдЯреАрдХ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ, рдиреЛрдб, рдпрд╛рд░реНрди/рдПрдирдкреАрдПрдо рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВред

рдЬреЗрд╕реНрдЯ 18.0.0, рдиреЛрдб 7.4, macOS

Confirmed Discussion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдирдХрд▓реА рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

jest.mock('whatever');

// Get the mock function
const whatever = require('whatever');

test('test 1', () => {
  whatever.mockImplementation(() => 'hello');
});

test('test 2', () => {
  whatever.mockImplementation(() => 'world');
});

рд╕рднреА 38 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jest.mock рдХреЙрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреЗ рд╕рд╛рде рдлрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ jest.doMock рд╕рд╛рде рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

doMock рд╕рд╛рде рд╡рд╣реА рдмрд╛рддред

рдбреЙрдХреНрд╕ рдореЗрдВ, рдореИрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдБ

рдиреЛрдЯ: babel-jest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдирдХрд▓реА рдХреЙрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ doMock рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд▓реЗрдХрд┐рди... рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдХреЛрдИ рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред

рдкреЗрд╢ рд╣реИ рдкреВрд░реА рдкрд░реАрдХреНрд╖рд╛

it('renders with the enabled feature', () => {
  jest.mock('services/feature', () => ({
      isEnabled: () => true
  }));

  const component = renderer.create(
      <MyComponent />
  );

  const tree = component.toJSON();
  expect(tree).toMatchSnapshot();
});

рдХреНрдпрд╛ рдЖрдк рдЬреАрдПрдЪ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕рдХрд╛ рд░реЗрдкреНрд░реЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬрд╝рд░реВрд░ред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ: https://github.com/tleunen/jest-issue-2582

рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рдг "рдЕрдХреНрд╖рдо" рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкрд╛рд╕ "рд╕рдХреНрд╖рдо" рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рд╣реИред
рдЗрдиреНрд╣реЗрдВ рджреЗрдЦреЗрдВ:
https://github.com/tleunen/jest-issue-2582/blob/master/src/MyComponent.js
https://github.com/tleunen/jest-issue-2582/blob/master/src/__tests__/MyComponent.spec.js

рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд▓рд╛рд╣ @thymikee @cpojer ?
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирдХрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА, рдореИрдВ рдЕрдкрдирд╛ рд╕рд┐рд░ рддреЛрдбрд╝ рд░рд╣рд╛ рдерд╛ рдХрд┐ jest.mock() рдиреЗ рдореЗрд░реЗ describe рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ (рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрд░реЗ рдЖрдпрд╛рдд рдХреЗ рдиреАрдЪреЗ) рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝реИрдХреНрдЯрд░реА рдХреЗ jest.mock() рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓ рд╡рд╛рд▓реЗ __mocks__ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

--рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рд╡рд┐рд╡рд░рдг рд╕реЗ рдкрд╣рд▓реЗ jest.mock() рдХрдерди рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ @tleunen , рдЗрд╕рдХрд╛ рд╢рд╛рдпрдж рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд░ рдлрд┐рд░

рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ jest.mock() рдХреЛ рд╣рдореЗрд╢рд╛ describe рдФрд░ it рдмреНрд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рддреЛ jest.mock рдХреЛ рдлрдВрдХреНрд╢рди рд╕реНрдХреЛрдк рдкрд░ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ require s рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ import s рдЬреЛ рдореЙрдбреНрдпреВрд▓ рд╕реНрдХреЛрдк рдкрд░ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдпрджрд┐ рдЖрдк рдЗрд╕реЗ describe рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓ рдХрд░реЗрдВ (рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреИрд╕реНрдореАрди рджреНрд╡рд╛рд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЖрдкрдХрд╛ jest.mock рдХреЙрд▓ рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЖрдо рддреМрд░ рдкрд░ рд╣рдо beforeEach рдФрд░ afterEach рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@cpojer рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдлрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИ (рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред jest.mock рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ:

beforeEach(() => { // or the specific test
  jest.mock('MyModule', () => тАж);
  const MyModule = require('MyModule');
  тАж
});

рдЖрджрд┐ред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ (рддреЛ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореЙрдХ рдХреИрд╕реЗ рджреЗрдВрдЧреЗ?)

рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдВрджрд░ рд░рдЦрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдпрд╛рдд/рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛ рдореИрдВ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдгрди/рдмреНрд▓реЙрдХ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдкрд╣рд▓реЗ/рдкрд╣рд▓реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рд╡реЗ рдорд╛рдорд▓реЗ рд╕рдВрднрд╡ рд╣реИрдВ?

// A.js depends on B.js
import A from './A';

describe('myTest', () => {

    describe('myFirstScope', () => {
        beforeAll(() => {
            jest.mock('./B', () => ({
                myFirstMethod: jest.fn(),
            }));
        });

        // tests here
    });

    describe('mySecondScope', () => {
        beforeAll(() => {
            jest.mock('./B', () => ({
                mySecondMethod: jest.fn(),
            }));
        });

        // tests here
    });
});

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ B рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрд╛рдж A рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред ( import рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди require рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

B рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрд╛рдж A рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрднреА рднреА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдмреА рдкрд╛рд╕ рдХреЗ рдореВрд▓ рдореЙрдХ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛

@GoldAnna рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ?

@alayor рдореЗрд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ

рдЬрд┐рддрдиреА рдмрд╛рд░ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ, рдЕрдм рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╛ рддреЛ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ jest рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЖрдЧреЗ рдкреНрд░рдорд╛рдг рдпрд╣ рд╣реИ рдХрд┐ jest рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдирдХрд▓реА рд╕рдВрдмрдВрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ ... рд╡реЗ рд╢рд╛рдпрдж рд╣реИрдВ рдФрд░ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╢рд╛рдпрдж рдЧрд▓рдд рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ModuleB рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ jest.resetModules() рдФрд░ jest.unmock('./moduleB') рджреЛрдиреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ...рдЙрдирдХрд╛ рдХреНрд░рдо рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ред

// Module A
const ModuleB = require('./moduleB');
const ModuleA = function() {
  this.title = new ModuleB().title;
  return this;
};
module.exports = ModuleA;

// Module B
const ModuleB = function() {
  this.title = 'Module B - Original'
  return this;
};
module.exports = ModuleB;

// Tests
describe('Jest a few tests', () => {
  it('should do something', () => {
    jest.resetModules();
    jest.mock('./moduleB', () => function() {
      this.title = 'Module B - Mock 1'
      return this;
    });
    const ModuleA = require('./moduleA');
    const moduleA = new ModuleA();
    expect(moduleA.title).toEqual('Module B - Mock 1');
  });

  it('should do something else', () => {
    jest.resetModules();
    jest.mock('./moduleB', () => function() {
      this.title = 'Module B - Mock 2'
      return this;
    });
    const ModuleA = require('./moduleA');
    const moduleA = new ModuleA();
    expect(moduleA.title).toEqual('Module B - Mock 2');
  });

  it('should do something original', () => {
    jest.resetModules();
    jest.unmock('./moduleB');
    const ModuleA = require('./moduleA');
    const moduleA = new ModuleA();
    expect(moduleA.title).toEqual('Module B - Original');
  });
});

рдЕрд░реЗ,

рдпрд╣рд╛рдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдХреГрдкрдпрд╛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрджрд░ jest.mock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

рд╢реБрдХреНрд░рд┐рдпрд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рдореЙрдХ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдбрдВрдк рдХрд░рдирд╛ рдпрд╛ рдкрд╣рд▓реЗ рдХреЗ рд╕рд╛рде рд░реАрд╡рд╛рдпрд░ рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдореЛрдХреНрд╕/рдЕрдЬреАрдм рдбреЗрдЯрд╛ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЗ рдЬрдВрдХ рдбреНрд░реЙрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдлрдВрд╕ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореЙрдХ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ ( test.concurrent )ред рдЕрдЧрд░ рд╣рдо рдЯреИрдк рдпрд╛ рдПрд╡рд╛ рдХреЗ рд╕рдорд╛рди рдПрдкреАрдЖрдИ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡реИрд╢реНрд╡рд┐рдХ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рдЦреБрд╢!

рдкрд╣рд▓реЗ рдореЛрдЪрд╛ рдФрд░ рдкреНрд░реЙрдХреНрд╕реАрдХреНрд╡рд╛рдпрд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред

@gcox рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдкрд░ рдореЙрдХрд┐рдВрдЧ (рдФрд░ рдмрд╛рдж рдореЗрдВ рдореЙрдбреНрдпреВрд▓рдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛) рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк mockImplementation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╣рдордиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред

@antgonzales рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдлрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдиреЛрдб рдореЗрдВ рдЕрд╕рдВрднрд╡ рд╕реЗ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИред

@jkomusin рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рдпрд╣реА рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдУрдкреА рдЖрдИрдПрдордУ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рдерд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреВрдЫ рд░рд╣реЗ рдереЗ, "рдореИрдВ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреЗ рдмрдЬрд╛рдп рдХрдИ рдЖрд╕рдиреНрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдирдХрд▓реА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП require('whatever') рдХреЛ рдХреИрд╕реЗ рдордЬрдмреВрд░ рдХрд░реВрдВ?"ред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдирдХрд▓реА рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

jest.mock('whatever');

// Get the mock function
const whatever = require('whatever');

test('test 1', () => {
  whatever.mockImplementation(() => 'hello');
});

test('test 2', () => {
  whatever.mockImplementation(() => 'world');
});

@gcox рдЙрддреНрддрд░ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди @SimenB рдиреЗ рднреА рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ!

@rafaeleyng рд▓реЗрдХрд┐рди @SimenB рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЬреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ ...

@gcox рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рдЗрд╕ рд╕рдордп рдмрд╣реБрдд рдХрдо рд╣реИред

@schhumannd рд╕рд╣реА рд╣реИред рдХреГрдкрдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдПрдВред

рдкреАрдЖрд░ рд╣рдореЗрд╢рд╛ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВ

рдореЙрдбреНрдпреВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░
https://github.com/facebook/jest/issues/2582#issuecomment -378677440 тЭдя╕П

рдЕрд░реЗ, рдЗрд╕реЗ рдЬреБрдбрд╝реЗ рдореБрджреНрджреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд┐рд▓рд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛:

jest.mock('child_process')
const childProcess = require('child_process')

describe('foo', () => {
  test('bar', () => {
    childProcess.execSync.mockImplentation(jest.fn().mockReturnValueOnce('wibble'))
    // code that itself requires child_process
    expect(childProcess.execSync.mock.results[0]).toEqual('wibble')
  })

  test('baz', () => {
    childProcess.execSync.mockImplentation(jest.fn().mockReturnValueOnce('wobble'))
    // code that itself requires child_process
    expect(childProcess.execSync.mock.results[0]).toEqual('wobble')
  })
})

рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдкрд░ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ/рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд╝реИрдХреНрдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

jest.mock('child_process')
const { execSync } = require('child_process')

describe('foo', () => {
  test('bar', () => {
    execSync.mockImplentation(jest.fn().mockReturnValueOnce('wibble'))
    // code that itself requires child_process
    expect(execSync.mock.results[0]).toEqual('wibble')
  })

  test('baz', () => {
    execSync.mockImplentation(jest.fn().mockReturnValueOnce('wobble'))
    // code that itself requires child_process
    expect(execSync.mock.results[0]).toEqual('wobble')
  })
})

рдЬреЗрд╕рди рдлрд╛рдЗрд▓реЛрдВ, рдпрд╛ рдореИрдк рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреИрд╕реЗ рдЧреИрд░ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ ...

@gcox рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдЬрдм рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдПрдХ рдЖрдпрд╛рддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ __mocks__ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рдореЙрдХ рдерд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ jest.mock('./ModuleA') рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ __mocks__/ModuleA.js рдореЗрдВ рдПрдХ рдирдХрд▓реА рд╣реИред рд▓реЗрдХрд┐рди рдореЙрдбреНрдпреВрд▓рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рд╣реИ, рдореЙрдбреНрдпреВрд▓рдмреА - рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓рдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╡рд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдзреАрди рд╣реИред рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд┐рдирд╛, рдореЙрдбреНрдпреВрд▓рдмреА рдХреЛ рдореЙрдбреНрдпреВрд▓рдП рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗрдЧрд╛, рдирдХрд▓реА рдирд╣реАрдВред

рдпрд╣ рдордЬрд╛рдХ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдореИрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдкрд░ jest.mock рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдИ рднреА рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдореЙрдХ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд░рдЦрддрд╛ рд╣реИ, рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдЪрд┐рддреНрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ?

@SimenB рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЛ

@SimenB рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж! рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд╢ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдкрде рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╕реНрдЯрдм рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдкрде рдореЗрдВ рдЕрд▓рдЧ рдЖрд╡рд░рдг рдерд╛ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд╕рдВрдкрд╛рджрдХ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдмрд╕ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рдерд╛ред

рдерд╛

const { stubMethod } = require("./path/to/File");
jest.mock("./path/to/File");

рдореЗрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ ( File рдХрд╛ рдЖрд╡рд░рдг рдмрджрд▓рдХрд░ file ):

const { stubMethod } = require("./path/to/file");
jest.mock("./path/to/file");

рдордирд╛рдЗрдП рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛред

рдЬреИрд╕реНрдореАрди spyOn() рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ _inside_ рдкрд░реАрдХреНрд╖рдгред рдЬреЗрд╕реНрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрдореЗрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдЬреИрд╕реНрдореАрди рдЙрджрд╛рд╣рд░рдг:

spyOn(require('moduleB'),┬а'functionA').and.callFake(()┬а=>┬аtrue);

рдЬрдм рдореЙрдХрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг-рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ doMock рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

test('moduleName 2', () => {
  jest.doMock('../moduleName', () => {
    return {
      __esModule: true,
      default: 'default2',
      foo: 'foo2',
    };
  });
  return import('../moduleName').then(moduleName => {
    expect(moduleName.default).toEqual('default2');
    expect(moduleName.foo).toEqual('foo2');
  });
});

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ "moduleName" рдХреЗ рдирдП рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдореЗрд░реЗ "рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг" -рдХреЛрдб рдХреЗ рдкрд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рддрдХ рднреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдиреЗ "moduleName" рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдЕрднреА рднреА рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдирдХрд▓реА рдирд╣реАрдВред

рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: https://github.com/facebook/jest/issues/3236

рдпреБрдХреНрддрд┐ - рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдПрдХ рдЖрджрд┐рдо рдореВрд▓реНрдп рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

```auth.js
рдирд┐рд░реНрдпрд╛рдд рдХрд╛рд╕реНрдЯ isUserAdmin = getSetting ('рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ');

And you want to use a mock value instead, in the test, then a simple require and assignment seems to do the trick:

```deleteUser.js
const auth = require('../auth');

describe('deleteUser', () => {
  it('can delete if admin', () => {
    auth.isUserAdmin = true;

    // call method that depends on isUserAdmin value
    // and assert on the result
  });
});

рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЖрдк jest.doMock() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ:

import myModuleToTest from './myModuleTotest'

describe('Given my module', () => {
  it('property1 will work as expect', () => {
    // Testing parts of the module that don't need to be mocked
  })

  it('property2 will work as expected', () => {
    jest.doMock('./myOtherModule', () => {
      return {
        __esModule: true,
        default: 'default2',
        foo: 'foo2',
      };
    });

    import('./myOtherModule').then(myOtherModule => {
      // I'm not interested on the mocked module myOtherModule but on the module that makes use of it
      myModuleToTest.doSomethingToSomeProperty(); // At this point myOtherModule's original module and not its mocked version will be used by myModuleToTest
      expect(myModuleToTest.someProperty).toBe('thisWillFail'); // The test won't pass because the mocked version wasn't used
    });
  });
});

рдЬреЗрд╕реНрдЯ 26 рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдПрдХ Object рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Function рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдордЬрд╛рдХ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ mockFn.mockImplementation(fn) рдирдХрд▓реА Objects )ред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ рдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореЙрдХ рдХреЗ рдмрд╛рдж myModuleToTest рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ
рдирдХрд▓реА рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рддреЛ, рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ .... рд╢реАрд░реНрд╖ рдкрд░ рдпрд╛
рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реИрд╕реЗ рднреА рдлрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдордВрдЧрд▓рд╡рд╛рд░, 7 рдЬреБрд▓рд╛рдИ, 2020, рд░рд╛рдд 10:24 рдмрдЬреЗ рдПрдВрдЯреЛрдирд┐рдпреЛ рд░реЗрдбреЛрдВрдбреЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдХреЛрдб рдЬреЛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ jest.doMock() рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

'./myModuleTotest' рд╕реЗ myModuleToTest рдЖрдпрд╛рдд рдХрд░реЗрдВ
рдпрд╣ ('рдХрд╛рдо рдХрд░реЗрдЧрд╛', () => {
jest.doMock('./myOtherModule', () => {
рд╡рд╛рдкрд╕реА {
__esрдореЙрдбреНрдпреВрд▓: рд╕рдЪ,
рдбрд┐рдлрд╝реЙрд▓реНрдЯ: 'рдбрд┐рдлрд╝реЙрд▓реНрдЯ 2',
рдлреВ: 'рдлреВ 2',
};
});

рд╡рд╛рдкрд╕реА рдЖрдпрд╛рдд ('../myOtherModule')ред рддрдм (myOtherModule => {
// рдореБрдЭреЗ рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ myOtherModule рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
myModuleToTest.doSomethingToSomeProperty (); // рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ myOtherModule рдХреЗ рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЗрд╕рдХреЗ рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ myModuleToTest рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдЙрдореНрдореАрдж (myModuleToTest.someProperty).toBe('thisWillFail'); // рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
});});

рдЬреЗрд╕реНрдЯ 26 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (I
рдорддрд▓рдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░) рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕
рд╕рд╣реА рд╣реИ рдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рддрдм рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/2582#issuecomment-655110424 , рдпрд╛
рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд
https://github.com/notifications/unsubscribe-auth/AAJR3UW6HARW44ZLKAUB7PLR2N77NANCNFSM4C4I7QSQ
.

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

StephanBijzitter picture StephanBijzitter  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mmcgahan picture mmcgahan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kgowru picture kgowru  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stephenlautier picture stephenlautier  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Antho2407 picture Antho2407  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ