ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 모듈패턴으로 기존 코드 개선하기 - 견고한 JS 소프트웨어 만들기 | 김정환
    Javascript/프로그래밍 기법 2021. 9. 2. 17:43
    반응형

     

    클릭 카운터 모듈 (ClickCounter)

    : 카운터 데이터를 다루는 모듈 (전역 공간에 있는 counter 변수를 ClickCounter 안에서 관리하자)

     

     

    첫번째 스펙 

    "ClickCounter 모듈의 getValue() 는 카운터 값을 반환한다."

    > git checkout --force ClickCounter-spec-1

      

     

    두번째 스펙

    "ClickCounter 모듈의 increase() 는 카운터 값을 1만큼 증가한다."

    > git checkout --force ClickCounter-spec-2

     

    beforEach는 it 함수 호출 직전에 실행되는 자스민 함수.

    describe(() => {
      beforeEach(() => {})	// 1
      afterEach(() => {})	// 3
      it(() => {})		// 2
    })

    중복 코드를 beforeEach로 옮기자.

    ※ 중복 코드를 제거한 코드를 DRY(Don't Repeat Yourself) 하다.

     

     

     

    클릭 카운트 뷰 모듈 (ClickCounte View)

    카운터 데이터는 돔(DOM)에 반영되어야 한다. 데이터를 출력하고 이벤트 핸들러를 바인딩하는 일을 담당할 것이다.

     

     

    첫번째 스펙

    "ClickCounterView 모듈의 updateView()는 카운트 값을 출력한다."

    > git checkout --force ClickCountView-spec-1

     

    Q) 데이터를 조회할 ClickCounter를 어떻게 얻을까? 데이터를 출력할 돔 엘리먼트는 어떻게 테스트 할까?

    A) 주입하자

     - ClickCounter는 객체를 만들어 파라미터로 전달 받자

     - 데이터를 출력할 돔 엘리먼트를 만들어 전달 받자

     

    TDD  방식으로 사고하다 보면 이런 식으로 필요한 모듈을 주입받아 사용하는 경향이 생김

    하나의 기능 단위로 모듈을 분리할 수 있기 때문에 단일 책임 원칙을 지킬 수 있다.

     

    Q) ClickCountView에 의존성 주입이 되었는지는 어떻게 체크할까?

    A) 의존성 주입을 테스트하는 코드를 작성한다.

     

     

    두번째 스펙

    "ClickCounterView 모듈의 increaseAndUpdateView()는 카운트 값을 증가하고 그 값을 출력한다."

    > git checkout --force ClickCountView-spec-2

     

    # 테스트 더블

    단위 테스트 패턴으로, 테스트하기 곤란한 컴포넌트를 대체하여 테스트하는 것. 특정한 동작을 흉내만 낼뿐이지만 테스트 하기에는 적합하다.

    • 더미(dummy): 인자를 채우기 위해 사용
    • 스텁(sturb): 더미를 개선하여 실제 동작하게끔 만든 것. 리턴값을 하드코딩한다.
    • 스파이(spy): 스텁과 유사, 내부적으로 기록을 남기는 추가 기능
    • 페이크(fake): 스텁에서 발전한 실제 코드.
    • 목(mock): 더미, 스텁, 스파이를 혼합한 형태

     

    자스민에서는 테스트 더블을 스파이스(spies)라고 부른다. spyOn(), createSpy() 함수를 사용할 수 있다.

     

     

    세번째 스펙

    "클릭 이벤트가 발생하면 increaseAndUpdateView()를 실행한다."

    > git checkout --force ClickCountView-spec-3

     

    클릭 이벤트 핸들러(increseAndUpdateView)를 바인딩할 돔 엘리먼트(triggerEl)를 주입 받자.

     

    반응형

    댓글

Luster Sun