describe('verifier', () => {
test('class constructor: on weekends, throws exception', () => {
const verifier = new PasswordVerifier([], new FakeTimeProvider(SUNDAY));
expect(() => verifier.verify('anything'))
.toThrow("It's the weekend!");
});
});
이 코드는 자바스크립트가 기본적으로 매우 관대한 언어라서 돌아간다. 자바스크립트는 너무나도 관대하여 루비나 파이썬처럼 덕 타이핑(duck typing)이 가능하다. 덕 타이핑이란 ‘어떤 새가 오리처럼 걷고 헤엄치고 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다’는 아이디어로, 동적 타이핑의 한 종류다.12 이 경우 RealTimeProvider가 반환하는 실제 객체와 FakeTimeProvider가 반환하는 가짜 객체는 완전히 다른 객체지만 동일한 함수를 구현한다. 그래서 하나를 다른 것 대신 사용할 수 있으며, 프로덕션 코드도 이를 문제없이 처리할 수 있다.
하지만 함수의 입력과 출력 타입이 올바른지 확인하는 것은 코드를 실행해야만 알 수 있다. 더 확실하게 하려면 정적 타입 검사를 지원하는 도구나 언어를 사용하는 것이 좋다.