expect().toBe() 함수 형태를 어떻게 만들기 고민하였습니다.
이 형태는 then, catch를 사용하는 Promise 형태가 아니기 때문입니다.
function expect() {
const trial = Function('"use strict";return (' + arguments[0] + ')')();
return {
toBe: (answer) => {
const isEuqual = trial === answer
if (isEuqual) {
return console.log(`결과가 동일합니다. expect: ${trial} result: ${answer}`)
}
return console.log(`결과가 다릅니다. expect: ${trial} result: ${answer}`)
}
}
}
function add(a, b) {
return a + b
}
expect("2+5").toBe(7)
expect("2*5").toBe(10)
expect("2/5").toBe(0.3)
expect(add(2, 3)).toBe(5)
expect(2 + 5).toBe(7)
/**
* 결과가 동일합니다. expect: 7 result: 7
* 결과가 동일합니다. expect: 10 result: 10
* 결과가 다릅니다. expect: 0.4 result: 0.3
* 결과가 동일합니다. expect: 5 result: 5
* 결과가 동일합니다. expect: 7 result: 7
*/
그래서 toBe 함수가 있는 객체를 반환하고자 하였습니다.
jest Expect 문서에서 toBe()는 '==='를 의미하여
isEqual boolean 변수에 trial과 answer 비교 결과를 담았습니다.
trial은 expect 문에서 받은 arguments 을 실행한 결과를 가집니다.
처음에는 eval() 함수를 사용하려 하였으나 인자로 받은 코드를 caller 권한으로 수행하는 보안상 위험한 함수이고
최신 JS 엔진에서 여러 코드 구조를 최적화하는 것과 달리 eval()은 JS 인터프리터를 사용해야 하기 때문에 다른 대안들보다 느리기 때문에 Function 으로 대체하였습니다
<참조>
MDN eval() 절대 사용하지 말 것!
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval
Jest Expect API reference
https://jestjs.io/docs/en/expect