[Javascript] Jest를 사용하여 ES6 모듈 가져 오기를 조롱하려면 어떻게해야합니까?


Answers

모듈을 조롱하고 스스로 스파이를 설정해야합니다.

import myModule from '../myModule';
import dependency from '../dependency';
jest.mock('../dependency', () => ({
  doSomething: jest.fn()
}))

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    myModule(2);
    expect(dependency.doSomething).toBeCalledWith(4);
  });
});
Question

나는 이것이 불가능하다고 생각하기 시작했으나 어쨌든 묻고 싶다.

내 ES6 모듈 중 하나가 다른 ES6 모듈을 특정 방식으로 호출하는지 테스트하고 싶습니다. 재스민으로 이것은 매우 쉽습니다 -

앱 코드 :

// myModule.js
import dependency from './dependency';

export default (x) => {
  dependency.doSomething(x * 2);
}

그리고 테스트 코드 :

//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    spyOn(dependency, 'doSomething');

    myModule(2);

    expect(dependency.doSomething).toHaveBeenCalledWith(4);
  });
});

Jest와 동등한 점은 무엇입니까? 나는이 일을 그렇게 간단하게하는 것처럼 느낀다. 그러나 나는 그것을 고치려고 내 머리를 찢어 버리고있다.

가장 가까운 것은 importrequire 로 바꾸고 테스트 / 함수 내부로 옮기는 것입니다. 어느 쪽도 내가하고 싶은 일이 아니다.

// myModule.js
export default (x) => {
  const dependency = require('./dependency'); // yuck
  dependency.doSomething(x * 2);
}

//myModule-test.js
describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    jest.mock('../dependency');

    myModule(2);

    const dependency = require('../dependency'); // also yuck
    expect(dependency.doSomething).toBeCalledWith(4);
  });
});

보너스 포인트의 경우, dependency.js 내부의 함수가 기본 내보내기 일 때 모든 것을 작동하게하고 싶습니다. 그러나, 나는 기본 수출에 대한 감시가 재스민에서 작동하지 않는다는 것을 안다. (또는 나는 적어도 그것을 작동시키지 못한다.) 그래서 나는 농담에서 가능할 것이라는 희망을 안고있다.




jest를 사용하여 ES6 종속성 모듈의 기본 내보내기를 모방하는 방법은 다음과 같습니다.

import myModule from '../myModule';
import dependency from '../dependency';

jest.mock('../dependency');

// If necessary, you can place a mock implementation like this:
dependency.mockImplementation(() => 42);

describe('myModule', () => {
  it('calls the dependency once with double the input', () => {
    myModule(2);

    expect(dependency).toHaveBeenCalledTimes(1);
    expect(dependency).toHaveBeenCalledWith(4);
  });
});

내 경우에는 다른 옵션이 작동하지 않았습니다.