<p>jest.mock ํŒฉํ† ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2017๋…„ 01์›” 12์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋ฒŒ๋ ˆ

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

test ๋˜๋Š” it ๋‚ด๋ถ€์—์„œ ํŒฉํ† ๋ฆฌ๋กœ mock์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ์˜ ๊ฐ์ฒด๊ฐ€ ํŒŒ์ผ์˜ ๋ฃจํŠธ ์ˆ˜์ค€์—์„œ ์ •์˜๋œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ชจ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ํŒŒ์ผ์„ ์กฐ๋กฑํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ Jest ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  Jest, ๋…ธ๋“œ, yarn/npm ๋ฒ„์ „ ๋ฐ ์šด์˜ ์ฒด์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.

Jest 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 ํ˜ธ์ถœ์€ babel-jest ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์˜ ๋งจ ์œ„๋กœ ์ž๋™์œผ๋กœ ํ˜ธ์ด์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. jest.doMock ํ•˜์—ฌ ์ด ๋™์ž‘์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

doMock ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ฐธ๊ณ : babel-jest ์‚ฌ์šฉํ•  ๋•Œ mock์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ ๋ธ”๋ก์˜ ๋งจ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ์ด ๋™์ž‘์„ ๋ช…์‹œ์ ์œผ๋กœ ํ”ผํ•˜๋ ค๋ฉด 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();
});

GH ์ €์žฅ์†Œ์—์„œ ์ด์— ๋Œ€ํ•œ ์žฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹ ํ•˜๋Š”. ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค: 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 ๋ฒ”์œ„์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒ ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹จ(ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ ์•„๋ž˜)์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์กฐ๋กฑ๋œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” __mocks__ ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์žฅ ์—†์ด jest.mock() ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

--ํŽธ์ง‘ํ•˜๋‹ค

jest.mock() ๋ฌธ์„ import ๋ฌธ ์•ž์— ์˜ฌ๋ ค๋†“๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @tleunen , ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์‘๋‹ต์œผ๋กœ ๋™์ผํ•œ ํŒŒ์ผ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์กฐ๋กฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ณด๋‹ค ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—๋Š” jest.mock() ๊ฐ€ ํ•ญ์ƒ describe ๋ฐ it ๋ธ”๋ก ์™ธ๋ถ€์— ์žˆ์œผ๋ฉด ๋” ๋ช…ํ™•ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌธ์„œ์— ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ jest.mock ๋Š” ํ•จ์ˆ˜ ๋ฒ”์œ„๋กœ ํ˜ธ์ด์ŠคํŠธ๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ require s(๊ทธ๋ฆฌ๊ณ  ํ™•์‹คํžˆ ๋ชจ๋“ˆ ๋ฒ”์œ„๋กœ ํ˜ธ์ด์ŠคํŠธ๋˜๋Š” import s๊ฐ€ ์•„๋‹˜)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. describe (Jasmine์— ์˜ํ•ด ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌ๋จ) ์ด์™ธ์˜ ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
jest.mock ํ˜ธ์ถœ์€ ๋ฐ”๋กœ ๊ทธ ํ•จ์ˆ˜(๋ชจ๋“ˆ์ด ์•„๋‹˜)์˜ ๋งจ ์œ„๋กœ ํ˜ธ์ด์ŠคํŠธ๋˜๋ฏ€๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด beforeEach ๋ฐ afterEach ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ์˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@cpojer ๋Š” ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ์œ„ ๋ฒ”์œ„์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํ˜ธ์ด์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์ด ์ดˆ๊ธฐํ™”๋  ๋•Œ(๊ฐ€์ ธ์˜ค๊ธฐ ์‚ฌ์šฉ) ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. jest.mock ๋Š” ๋‚˜์ค‘์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

beforeEach(() => { // or the specific test
  jest.mock('MyModule', () => โ€ฆ);
  const MyModule = require('MyModule');
  โ€ฆ
});

๋“ฑ.

beforeEach์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ ๊ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ชจ์˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?)

ํ…Œ์ŠคํŠธ ์ž์ฒด์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฌผ๋ก  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์— ๋ชจ์˜ ๋ชจ๋“ˆ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์กฐ๋กฑํ•˜๋ ค๋Š” ํŒŒ์ผ(์˜ˆ: ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ข…์†์„ฑ)์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ describe/it ๋ธ”๋ก์œผ๋กœ ์ง€์ •๋˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” beforeEach/beforeAll ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅด๊ฒŒ ์กฐ๋กฑํ•˜๊ณ  ์‹ถ์–ด๋„? ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

// 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 ํ•„์š”

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜์ง€ ์•Š์•˜๊ณ  ์—ฌ์ „ํžˆ B์˜ ์›๋ž˜ ๋ชจ์˜๊ฐ€ ๊ฒฐ๊ณผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@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์„ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ธฐ๋Šฅ ์š”์ฒญ์œผ๋กœ ๋‹ค์‹œ ์—ด๋ ค์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ์˜ ํด๋”์— ๋ฌผ๊ฑด์„ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ beforeEach๋กœ ๋‹ค์‹œ ๋ฐฐ์„ ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ํฌํ•จ๋˜๋Š” ๋ชจ์˜/์ด์ƒํ•œ ๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šคํ™”์˜ ์ •ํฌ ์„œ๋ž์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž‘์€ ๋ชจ์˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์‹ค์ œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค( test.concurrent ). ํƒญ์ด๋‚˜ ava์™€ ์œ ์‚ฌํ•œ API๋ฅผ ์ฑ„ํƒํ–ˆ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ ํ˜„์žฌ ๊ธ€๋กœ๋ฒŒ API๊ฐ€ ๋ถ€๊ณผํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

์ด์ „์— mocha ๋ฐ proxyquire๋กœ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๊ณ  ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ชจ์˜์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@gcox ๋ชจ๋“ˆ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ชจ์˜(๊ทธ๋ฆฌ๊ณ  ์ดํ›„์— moduleA ์š”๊ตฌ)๋ฅผ ์‹œ๋„ํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋ชจ์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๋ฅผ ์œ„ํ•ด mockImplementation ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@antgonzales ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ชจ๋“ˆ์˜ ๋งจ ์œ„๋กœ

@jkomusin ํ™•์‹คํžˆ. ๊ทธ๊ฒƒ์€ OP๊ฐ€ ์š”๊ตฌํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค, IMO. ๋‚˜๋Š” ๊ทธ๋“ค์ด ํŠนํžˆ " 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 ์˜ˆ์ œ์—๋Š” ์ง€๋‚œ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฌธ์„œ์—์„œ ๊ฒ€์ƒ‰ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ˜„์žฌ๋กœ์„œ๋Š” ๋งค์šฐ ๋“œ๋ฌธ ๊ณต์‹ ๋ฌธ์„œ์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@schumand ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ณ  ์„ ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

PR์€ ํ•ญ์ƒ ๋ฌธ์„œ ๊ฐœ์„ ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

๋ชจ๋“ˆ ์˜ˆ์ œ ๊ธฐ๋ฐ˜
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')
  })
})

json ํŒŒ์ผ์ด๋‚˜ ๋งคํ•‘๋œ ์ƒ์ˆ˜์™€ ๊ฐ™์€ ๋น„ํ•จ์ˆ˜ ์ข…์†์„ฑ์„ ์กฐ๋กฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค ...

@gcox ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์ด __mocks__ ํด๋”์— ์ˆ˜๋™ ๋ชจ์˜๊ฐ€ ์žˆ์—ˆ๋˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฐพ์€ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํ˜ธ์ถœ jest.mock('./ModuleA') ์— ์‹ค๋ฌผ ํฌ๊ธฐ์˜ ๋ชจํ˜•์ด์žˆ๋Š”, __mocks__/ModuleA.js . ๊ทธ๋Ÿฌ๋‚˜ ModuleA๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ด ์•„๋‹ˆ๋ฉฐ ModuleA๊ฐ€ ํ•„์š”ํ•œ ModuleB๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ์—†์œผ๋ฉด ModuleB๋Š” ๋ชจ์˜๊ฐ€ ์•„๋‹Œ ModuleA์˜ ์‹ค์ œ ๊ตฌํ˜„์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋†๋‹ด์˜ ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์—์„œ jest.mock์„ ํ˜ธ์ถœํ•  ๋•Œ ๋ชจ์˜ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋ชจ๋“  ๋ชจ๋“ˆ์ด ๋ชจ์˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์™„์ „ํžˆ ์ž˜๋ชป ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@SimenB ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์กฐ๋กฑ๋œ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜๊ณ  ํ…Œ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋„ ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ? ์ •๋ง ๊ณ ๋งˆ์›Œ.

@SimenB ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”! ๋‚ด๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ธฐ ์ „์— Wish๋ฅผ ๋” ์ผ์ฐ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์Šคํ…ํ•˜๋ ค๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋ฅผ ์กฐ๋กฑํ•˜๊ณ  ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ฒฝ๋กœ์— ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํŽธ์ง‘์ž๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜€๋‹ค

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

๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝ๋จ( File ๋ฅผ file ):

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

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Jasmine spyOn() ๋Š” _inside_ ํ…Œ์ŠคํŠธ์—์„œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Jest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌ์Šค๋ฏผ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์žฌ์Šค๋ฏผ ์˜ˆ:

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
๋‚ด๋ณด๋‚ด๊ธฐ const 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
    });
  });
});

Jest 26 ํ˜„์žฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Object ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์กฐ๋กฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค( mockFn.mockImplementation(fn) ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Function ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์กฐ๋กฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค mockFn.mockImplementation(fn) ์กฐ๋กฑ Objects ). ์ด๊ฒŒ ๋งž๋‚˜์š” ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‚˜์š”? ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ ๋™์ผํ•œ ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์— myModuleToTest๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์กฐ๋กฑ์ด ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ์ „์—. ๋”ฐ๋ผ์„œ import ....๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์–ด์จŒ๋“  ํ˜ธ์ด์ŠคํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ๋‚ด๋ถ€.

2020๋…„ 7์›” 7์ผ ํ™”์š”์ผ ์˜คํ›„ 10:24 Antonio Redondo [email protected]
์ผ๋‹ค:

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
jest.doMock() ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

'./myModuleTotest'์—์„œ myModuleToTest ๊ฐ€์ ธ์˜ค๊ธฐ
it('์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค', () => {
jest.doMock('./myOtherModule', () => {
๋ฐ˜ํ’ˆ {
__esModule: ์ฐธ,
๊ธฐ๋ณธ๊ฐ’: 'default2',
foo: 'foo2',
};
});

return import('../myOtherModule').then(myOtherModule => {
// ๋ชจ์˜ ๋ชจ๋“ˆ myOtherModule์—๋Š” ๊ด€์‹ฌ์ด ์—†์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์—๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.
myModuleToTest.doSomethingToSomeProperty(); // ์ด ์‹œ์ ์—์„œ ๋ชจ์˜ โ€‹โ€‹๋ฒ„์ „์ด ์•„๋‹Œ myOtherModule์˜ ์›๋ž˜ ๋ชจ๋“ˆ์ด myModuleToTest์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Œ€(myModuleToTest.someProperty).toBe('thisWillFail'); // ๋ชจ์˜ ๋ฒ„์ „์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
});});

Jest 26์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ ์กฐ๋กฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค(I
๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑฐ์•ผ?
์ •ํ™•ํ•˜๊ฑฐ๋‚˜ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋” ๋งŽ์€
๋™์ผํ•œ ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/facebook/jest/issues/2582#issuecomment-655110424 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAJR3UW6HARW44ZLKAUB7PLR2N77NANCNFSM4C4I7QSQ
.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰