-
Jest - Module Function2 (mock implementations, mock Name)FrameWork/Jest 2023. 3. 9. 17:52
Mock Implementations
함수 전체를 대체
- 아직 구현이 안되어 있거나 내부 구현이 복잡하여 테스트를 하기 힘든 겨우
- 테스트를 위해 간단한 구현체를 만들어 해당 함수를 대체
- jest.fn, mockImplementation을 사용하여 구현
- jest.mock으로 mocking 하겠다고 지저하면, 실제 구현채가 가려지고 mock 구현체를 바라보게 된다.
const foo = require("../../lib/foo"); jest.mock("../../lib/foo"); describe("Mock Implementations", () => { test("test jest fn", () => { const myMockFn = jest.fn((callback) => callback(null, true)); //myMockFn에 인자로 함수를 넣으면 callback이라는 이름을 갖는 함수가되고 //해당 함수에 첫번째 인자로 null을 두번째 인자로 true를 넣은뒤 실행되고 //실행된 함수의 결과 값이 반환 된다. expect(myMockFn((err, val) => val)).toBeTruthy(); }); test("test mock implementation", () => { foo.mockImplementation(() => { console.log("Mock implementation"); return 77; }); expect(foo()).not.toBe(42); // Actual implementation이 아닌, expect(foo()).toBe(77); // Mock implementation이 실행 된다. }); });
한 번의 호출에 대한 구현만 대체
- 다양한 경우를 테스트 하는 경우
- 호출 마다 다른 결과 값을 return 하도록 구현하는 것이 가능하다.
- mockImplementationOnce로 구현
- 한 번의 호출에 대한 구현을 지정할 수 있고,지정된 구현이 더 이상 없다면 jest.fn에 지정한 기본 구현을 사용한다. 기본 구현이 없다면 undefined가 return 된다.
기본 함수가 없는 경우 mockImplementationOnce구현
describe("Mock Implementation Once", () => { test("test mockImplementationOnce without default", () => { const myMockFn = jest .fn() .mockImplementationOnce((callback) => callback(null, true)) .mockImplementationOnce((callback) => callback(null, false)); const callbackFn = (err, val) => val; expect(myMockFn(callbackFn)).toBeTruthy(); expect(myMockFn(callbackFn)).toBeFalsy(); expect(myMockFn(callbackFn)).toBeUndefined(); }); });
기본 함수가 있는 경우 mockImplementationOnce구현
test("test mockImplementationOnce with default", () => { const myMockFn = jest .fn((callback) => callback(null, "default")) .mockImplementationOnce((callback) => callback(null, true)) .mockImplementationOnce((callback) => callback(null, false)); const callbackFn = (err, val) => val; expect(myMockFn(callbackFn)).toBeTruthy(); expect(myMockFn(callbackFn)).toBeFalsy(); expect(myMockFn(callbackFn)).toBe("default"); });
체이닝을 위해 this를 return하는 경우
describe("Mock Return This", () => { test("test mockReturnThis", () => { const myObj = { myMethod: jest.fn().mockReturnThis(), // myMethod: jest.fn(function(){ // return this; // }) log: jest.fn(() => "logging"), }; expect(myObj.myMethod()).toEqual(myObj); expect(myObj, myMethod().log()).toBe("logging"); }); });
function을 사용해서 정의한 함수 안에서 'this'는 함수의 부모를 가르킨다. 따라서 myObj의 메소드 myMethod는 this를 return하므로 myMethod의 부모인 myObj를 return하게 된다.
Mock Name
describe("Mock Name", () => { test("test display mock function name", () => { const myMockFn = jest.fn().mockName("namedMockFn"); expect(myMockFn).toHaveBeenCalled(); //호출이되는지 테스트 }); }); // 이름 지정 안한 경우 // Error: expect(jest.fn()).toHaveBeenCalled() // 이름 지정 한 경우 // Error: expect(jest.fn()).toHaveBeenCalled()
mock함수에 이름이 지정되지 않은 경우
mock함수에 이름이 지정된경우
출처
https://velog.io/@modolee/jest-user-guide-07
'FrameWork > Jest' 카테고리의 다른 글
Jest - Testing2 (0) 2023.03.20 Jest - Jest Object1 (jest.spyOn( )) (0) 2023.03.10 Jest - Mock Function1 (모듈 mocking jest.fn( ), jest.mock( )) (0) 2023.03.09 Jest - beforeEach (0) 2023.03.06 Jest - create( ) - node-mock-http (0) 2023.03.06