내가하고 싶은 조롱 의존성의 구현을 변경 당에 단일 시험 기준 에 의해 기본 모형 확장 의 동작을하고 다시 되 돌리는 원래 구현 다음 테스트 실행한다.
더 간단히 말하자면 이것이 내가 달성하려는 것입니다.
- 모의 의존성
- 단일 테스트에서 모의 구현 변경 / 확장
- 다음 테스트가 실행되면 원래 모의로 되돌립니다.
나는 현재 Jest v21
.
일반적인 Jest 테스트는 다음과 같습니다.
__mocks__/myModule.js
const myMockedModule = jest.genMockFromModule('../myModule');
myMockedModule.a = jest.fn(() => true);
myMockedModule.b = jest.fn(() => true);
export default myMockedModule;
__tests__/myTest.js
import myMockedModule from '../myModule';
// Mock myModule
jest.mock('../myModule');
beforeEach(() => {
jest.clearAllMocks();
});
describe('MyTest', () => {
it('should test with default mock', () => {
myMockedModule.a(); // === true
myMockedModule.b(); // === true
});
it('should override myMockedModule.b mock result (and leave the other methods untouched)', () => {
// Extend change mock
myMockedModule.a(); // === true
myMockedModule.b(); // === 'overridden'
// Restore mock to original implementation with no side effects
});
it('should revert back to default myMockedModule mock', () => {
myMockedModule.a(); // === true
myMockedModule.b(); // === true
});
});
지금까지 시도한 내용은 다음과 같습니다.
1- mockFn.mockImplementationOnce (fn)
찬성
- 첫 번째 호출 후 원래 구현으로 되돌립니다.
단점
- 테스트가
b
여러 번 호출되면 중단됩니다. b
호출되지 않을 때까지 원래 구현으로 되 돌리지 않습니다 (다음 테스트에서 유출).
암호:
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
myMockedModule.b.mockImplementationOnce(() => 'overridden');
myModule.a(); // === true
myModule.b(); // === 'overridden'
});
2- jest.doMock (모듈 이름, 공장, 옵션)
찬성
- 모든 테스트에서 명시 적으로 다시 조롱
단점
- 모든 테스트에 대한 기본 모의 구현을 정의 할 수 없습니다.
- 모의 메서드를 다시 선언하도록 기본 구현을 확장 할 수 없습니다.
암호:
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
jest.doMock('../myModule', () => {
return {
a: jest.fn(() => true,
b: jest.fn(() => 'overridden',
}
});
myModule.a(); // === true
myModule.b(); // === 'overridden'
});
3-setter 메서드를 사용한 수동 조롱 ( 여기에 설명 된대로 )
찬성
- 모의 결과에 대한 완전한 제어
단점
- 많은 상용구 코드
- 장기간 유지하기 어려움
암호:
__mocks__/myModule.js
const myMockedModule = jest.genMockFromModule('../myModule');
let a = true;
let b = true;
myMockedModule.a = jest.fn(() => a);
myMockedModule.b = jest.fn(() => b);
myMockedModule.__setA = (value) => { a = value };
myMockedModule.__setB = (value) => { b = value };
myMockedModule.__reset = () => {
a = true;
b = true;
};
export default myMockedModule;
__tests__/myTest.js
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
myModule.__setB('overridden');
myModule.a(); // === true
myModule.b(); // === 'overridden'
myModule.__reset();
});
4- jest.spyOn (객체, 메소드 이름)
단점
mockImplementation
원래 모의 반환 값으로 되돌릴 수 없으므로 다음 테스트에 영향을 미칩니다.
암호:
beforeEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});
// Mock myModule
jest.mock('../myModule');
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
const spy = jest.spyOn(myMockedModule, 'b').mockImplementation(() => 'overridden');
myMockedModule.a(); // === true
myMockedModule.b(); // === 'overridden'
// How to get back to original mocked value?
});