FrameWork/Jest

Jest - TDD 개발 방식 순서

Surge100 2023. 3. 6. 15:39

 

TDD 개발방식

1. 해야할일 정의 

2. 단위 테스트 작성 - 실제 코드 작성전에 test case를 작성한다.

3. 테스트 코드에 대응하는 실제 코드작성 - test case가 성공(passed)될 수 있게 실제 코드를 작성한다.

 

const productController = require("../../controller/products");

describe("Product Controller Create", () => {
  it("should have a createProduct function", () => {
    expect(typeof productController.createProduct).toBe("function");
  });
});

product 인스턴스 data를 database에 저장하기 위해, 저장 동작을 하는 함수를 생성해야한다. 그렇기 때문에  제일 먼저 product 인스턴스를 database에 저장하는 함수가 존재 하는지 부터 test를 한다. 

 

Product인스턴스 DB에 저장

const productController = require("../../controller/products");
const productModel = require("../../models/Product");

productModel.create = jest.fn();

describe("Product Controller Create", () => {

  it("should call ProductModel.create", () => {
    productController.createProduct();
    expect(productModel.create).toBeCalledWith();
  });

});

 

product 인스턴스 data를 database에 저장하는 createProduct 함수를 호출할때 Product Model의 Create메소드가 호출되는지 확인하해야한다. database에 data를 저장할 때는 Model(Product)의 create, delete 메소드 등을 이용해서 저장할 수 있다.

 

즉 database에 product 인스턴스 data를 넣어 줄때는 Product model이 호출이 된다. 

 

expect(productModel.create)이 되는 지 확인은 할때 지금 unit test를 해주고 있기 때문에 직접적으로 Model에 영향을 받으면 안된다. 진짜 작동하는 ProductModel.create는 database와 직접적으로 연결되는 메소드가 작동하는 것이기때문이다. 그러므로 이때 mock함수를 이용해준다. 

 

productModel.create = jest.fn();

 jest.fn()을 사용해서 productModel.create 함수를 생성해주면, productModel.create 부분이 1)어떤 것에 의해서 호출이 되는지 그리고 2)어떤 것과 함께 호출이 되는지 알 수 가 있다. 

 

그래서 productController.createProduct( )가 호출이 될때 productModel.create이 호출이 됐는지 안됐는지 그부분을 jest.fn으로 mock함수를 만들어 spy하고 있기때문에 호출 여부를 알 수 있다. 

 

 

[출처 -

https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-tdd/dashboard]