bytrustu tech blog

[Jest] Mock 본문

TDD

[Jest] Mock

bytrustu 2022. 12. 21. 14:15
Jest Mock에 대해 알아보자

https://jestjs.io/docs/mock-functions

 

Mock Functions · Jest

Mock functions allow you to test the links between code by erasing the actual implementation of a function, capturing calls to the function (and the parameters passed in those calls), capturing instances of constructor functions when instantiated with new,

jestjs.io

Mock Functions

실제 구현 된 함수를 Mock 함수로 대체하면 코드 간의 상호 작용이 쉽게 테스트 가능하다.

Jest에서 제공하는 mock 함수를 사용해서 테스트를 진행 할 수 있다.

 

toBeCalled: 함수가 호출 되었는지 테스트한다.

toHaveBeenCalledTimes: 함수가 n번 호출되었는지 테스트한다.

toHaveBeenCalledWith: 함수를 호출 했을때 결과를 테스트한다.

const check = (predicate, onSucess, onFailure) => {
  if (predicate()) {
    onSucess('yes');
  } else {
    onFailure('no');
  }
}

module.exports = check;
describe('check 함수를 테스트 합니다.', () => {
    let onSucess;
    let onFailure;

    beforeEach(() => {
        onSucess = jest.fn();
        onFailure = jest.fn();
    });

    it('predicate의 값이 true이면 onSuccess를 호출합니다.', () => {
        check(() => true, onSucess, onFailure);
        expect(onSucess).toBeCalled();
        // expect(onSucess.mock.calls.length).toBe(1);
        expect(onSucess).toHaveBeenCalledTimes(1);
        // expect(onSucess.mock.calls[0][0]).toBe('yes');
        expect(onSucess).toHaveBeenCalledWith('yes');
        expect(onFailure).toHaveBeenCalledTimes(0);
    });

    it('predicate의 값이 false이면 onFailure를 호출합니다.', () => {
        check(() => false, onSucess, onFailure);
        expect(onSucess).toHaveBeenCalledTimes(0);
        expect(onFailure).toHaveBeenCalledTimes(1);
        expect(onFailure).toHaveBeenCalledWith('no');
    });
})

mockImplementation

Mock 함수는 기본적으로 아무런 동작, 리턴을 하지 않는다.

.mockImplementation()은 Mock 함수를 즉석으로 구현할 수 있고, 동작하는 Mock 함수를 만들수 있다.

jest.mock('../messageService'); 와 같이 해당 파일을 mock으로 지정해주면 해당 내용 전체가 Mock 함수로 지정 된다.

const sendEmail = (email, message) => {
    // 이메일 보내는 코드
}

const sendSMS = (phone, message) => {
    // SMS 보내는 코드
}

module.exports = {
    sendEmail,
    sendSMS,
}
class ProductClient {
    fetchItems() {
        return fetch('http://example.com/login').then((response) => response.json());
    }
}

module.exports = ProductClient;
const { register, unregister } = require('../userService');
const { sendEmail, sendSMS } = require('../messageService');
jest.mock('../messageService');

describe('userService를 테스트 합니다.', () => {
    const user = {
        email: 'bytrustu@gmail.com',
        phone: '010-1234-5678',
    };

    test('register를 테스트 합니다.', () => {
        register(user)
        expect(sendEmail).toBeCalledTimes(1);
        expect(sendEmail).toBeCalledWith(user.email, '회원가입을 축하합니다.');
        expect(sendSMS).toBeCalledTimes(1);
        expect(sendSMS).toBeCalledWith(user.phone, '회원가입을 축하합니다.');
    });

    test('unregister를 테스트 합니다.', () => {
        unregister(user);
        expect(sendEmail).toBeCalledTimes(1);
        expect(sendEmail).toBeCalledWith(user.email, '회원탈퇴 되었습니다.');
        expect(sendSMS).toBeCalledTimes(1);
        expect(sendSMS).toBeCalledWith(user.phone, '회원탈퇴 되었습니다.');
    });
});

 

'TDD' 카테고리의 다른 글

[Jest] 비동기 테스트 하기  (0) 2022.12.19
[Jest] Matchers 사용하기  (2) 2022.12.18
[Jest] 초기 환경설정  (0) 2022.12.17
Comments