제 아이디어는 아니고.. 야곰아카데미 리뷰어 붱이님의 아이디어를 정리한 내용입니다
우리가 설계한 타입의 어떤 메서드가 private인 경우를 생각해봅시다
struct 가위바위보게임 {
private var 승패결과: String
func 게임실행() {
...
...
승패결정()
...
...
}
private func 승패결정(왼손: Hand, 오른손: Hand) { // 테스트 어려움
...
...
승패결과 = 승
}
}
우리가 테스트 코드를 작성함에 있어 이렇게 공개되지 않은 메서드는 (공개된 게임실행()
메서드를 통해 간접적으로는 가능하겠지만) 단독적으로 테스트하기 어렵습니다
단독적으로 테스트하지 못하는 기능에 대해선, 테스트 유연성도 떨어지고 높은 신뢰도를 확보하기가 어렵기에 가능하다면 개선이 필요해보입니다
그렇다면, 테스트를 위해 승패결정()
메서드를 공개하는건 어떨까요?
이는 승패결과
프로퍼티를 외부에서 임의로 변경가능하다는 side-effect를 낳게 됩니다. 단지 테스트를 위해 이런 side-effect를 오픈하는 것은 적절치 않을 것입니다
side-effect도 낳지 않으면서 독립적인 테스트도 가능하게 할 방법이 있을까요?
다른 방법도 있겠지만 테스트하려는 기능을 '별도의 타입'으로 만드는 방법이 있습니다
struct 가위바위보게임 {
private var 가위바위보심판자: 심판자
func 게임실행() {
...
...
가위바위보심판자.승패결정()
...
...
}
}
struct 심판자 {
var 승패결과: String
func 승패결정(왼손: Hand, 오른손: Hand) { // 테스트 가능
...
...
승패결과 = 승
}
}
위와 같이 private 기능을 별도의 타입으로 만들고 해당 타입의 인스턴스를 private으로 갖도록 구현합니다.
가위바위보게임
의 게임결과를 게임실행()
메서드에 의해서만 변경될 수 있도록 지키면서 승패결정()
메서드를 독립적으로 테스트할 수 있게 됩니다