ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.