Chai .eql (feat. deep copy) (TIL 21일차)

EenSung Kim·2021년 4월 25일
0

"단번에 모든걸 다 끝내려고 하지 않아도 좋다."


코드를 작성하고 나면 코드가 제대로 실행되는지 여부를 체크해야 합니다. 함수를 예로 들면, 원하는 인자값을 전달했을 때 결과값이 내가 의도한 대로 나오는지를 보는 것이죠. 만약 내가 생각한 것과 다른 결과가 나온다면 코드를 수정하거나 개선해야 합니다.

개발도 마찬가지입니다. 의도한 바를 구현해내고 또 원하는 대로 작동해야 비로소 잘 된 개발이라고 할 수 있을 겁니다. 이를 위해서 꼭 필요한 것이 사전에 미리 테스트하는 과정입니다.

개발을 마무리짓고 나서 테스트를 하며 수정하는 방향도 있겠지만, 개발에 앞서 시나리오를 먼저 만들고 검증하며 동시에 개발을 진행하는 방법도 있습니다. BDD (Behavior/Business Driven Development) 라고 하는 방법입니다.

BDD 는 함수 단위의 테스트를 위한 코드부터 작성하는 TDD (Test Driven Development) 에서 파생되어 등장했다고 합니다. BDD 는 개발자가 아닌 사람이 봐도 이해할 수 있는 시나리오를 구축하고, 결과가 제대로 나오는지를 검증하는 것을 통해 비즈니스의 요구 사항을 빠르게 반영할 수 있습니다.

참고자료
https://blog.metafor.kr/159


아직은 기초를 닦아나가는 중이라 BDD 방법론을 글로만 배우고 있지만, 실제로 어떻게 쓰이는지를 확인해 볼 기회가 있었습니다. 공부하고 있는 부트캠프에서 수강생들의 코드를 확인하는 과정에 BDD/TDD Assertion Library 인 Chai 를 활용하고 있기 때문입니다.

const name = '김코딩'
const age = 28

const person = {
    name,
    age,
    level: 'Junior',
}

expect(person).to.eql(예상되는 값을 넣으시오.)

위의 코드에서 expect 로 시작하는 줄이 Chai 를 활용한 코드입니다. expect() 안의 내용에 코드의 결과가 들어가도록 한다면, 의도한 대로 코드를 잘 작성했는지를 확인할 수 있을 겁니다. 위의 경우에는 이미 작성된 코드가 어떻게 돌아가는지를 예상하도록 하기 위해 eql() 안의 내용에 예상되는 결과값을 넣도록 했죠.

이 경우에는 사실 person 을 넣어도 되긴 합니다. 너무나 당연하지만 person === person 일테니까요. 하지만 예상되는 값을 넣으라는 출제자의 의도를 고려해 이 방법보다는 다른 방법을 고민해 보겠습니다.

위에서 쓰인 것은 '객체의 단축(shorthand)' 문법입니다. 변수명을 그대로 키로 가져오고 할당된 데이터를 값으로 가져와 객체 내부의 속성으로 만드는 문법이죠. 그렇기 때문에 person 이라는 객체는 아래와 같은 모습이 됩니다.

{
  name: '김코딩',
  age: '28',          // === person 객체
  level: 'Junior',
}

eql() 안에 이 내용을 적으면 될 것 같습니다. 다 적는 것이 불편하다면 spread 문법을 활용해서 {...person} 이라고 적을 수도 있겠죠. (물론 person 을 넣는거랑 과연 무엇이 다른가하는 문제가 있지만..)중요한 것은 변수를 선언하고 값을 할당한 것을 객체의 단축 문법을 활용해 바로 객체 내부의 속성으로 만들 수 있다는 걸 이해하는 것일 겁니다.


근데 문제를 풀다가 이해가 안 되는 지점이 생겼습니다. 기본적으로 객체는 참조형으로 값을 전달하기 때문에 === 으로 비교가 불가능합니다. 마찬가지로 서로 다른 객체가 같은지 여부를 묻는다면 당연히 false 값이 나오지 않을까요? 근데 위의 expect().to.eql() 은 서로 다른 객체인 이 둘을 비교하고 있습니다. 어떻게 그런 것이 가능한 것인지 궁금해 chai 의 .eql() 문법을 알아봤습니다.

Asserts that the target is deeply equal to the given obj. See the deep-eql project page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql.

Chai 공식 홈페이지에 있는 .eql() 문법에 대한 설명입니다. eql 내부에 주어진 객체가 타겟과 deeply equal 하는 걸 가정한다고 되어있죠. 기존의 === 을 이용해 비교할 경우에는 두 객체가 같은 레퍼런스를 참조하고 있는지를 확인하게 되지만, eql 은 두 객체가 같은지 여부를 마치 원시형 자료처럼 확인하는 것이죠.

Chai 를 활용하면 정확하게 값을 비교할 때는 .equal() 을 사용할 수 있고, 이처럼 객체를 비교할 때는 .eql() 을 사용할 수 있습니다. 실제로 서로 다른 두 객체를 이렇게 비교해야 할 경우가 있는 만큼 꼭 필요한 문법이라는 생각이 듭니다.

profile
iOS 개발자로 전직하기 위해 공부 중입니다.

0개의 댓글