1 개의 메인 클래스와 2 개의 작은 클래스로 리팩토링 된 클래스가 있습니다. 주요 수업은 데이터베이스를 사용하고 (많은 수업과 마찬가지로) 이메일을 보냅니다. 메인 클래스가있다 그래서 IPersonRepository
하고는 IEmailRepository
자신의 차례에서 2 개 작은 클래스로 보내는 주입.
이제 메인 클래스를 단위 테스트하고 클래스 테스트를 중단하지 않고 내부 작업을 변경할 수 있어야하기 때문에 클래스의 내부 작업을 단위 테스트하지 않는 방법을 배웠습니다.
클래스가 사용하기 때문에 그러나 IPersonRepository
하고 IEmailRepository
, 나는 가질 에 대한 몇 가지 방법에 대해 (모의 / 더미) 결과를 지정합니다 IPersonRepository
. 메인 클래스는 기존 데이터를 기반으로 일부 데이터를 계산하여 반환합니다. 그것을 테스트하고 싶다면 IPersonRepository.GetSavingsByCustomerId
x를 반환 하도록 지정하지 않고 테스트를 작성하는 방법을 알 수 없습니다 . 그러나 내 단위 테스트는 내부 작업에 대해 '알고'있습니다. 왜냐하면 어떤 방법을 조롱해야하는지 알지 못하기 때문입니다.
내부에 대해 테스트하지 않고 종속성을 주입 한 클래스를 어떻게 테스트 할 수 있습니까?
배경:
내 경험상 이와 같은 많은 테스트는 리포지토리에 대한 모의를 만든 다음 모의에 적합한 데이터를 제공하거나 실행 중에 특정 메소드가 호출되었는지 테스트합니다. 어느 쪽이든, 테스트는 내부에 대해 알고 있습니다.
이제 테스트에서 구현에 대해 알아야 할 이론 (이전에 들었음)에 대한 프레젠테이션을 보았습니다. 당신이 테스트되지 않은 먼저 때문에 어떻게 작동하지만, 또한 지금은 구현에 대해 '알고있다'때문에 모든 단위 테스트가 실패 구현을 변경할 때 때문이다. 테스트의 개념이 구현을 모르는 것을 좋아하지만 테스트를 수행하는 방법을 모르겠습니다.
IPersonRepository
객체를 기대하자마자 그 인터페이스와 그 인터페이스가 설명하는 모든 메소드가 더 이상 "내부"가 아니기 때문에 실제로 테스트의 문제는 아닙니다. 당신의 진정한 질문은 "공개적으로 너무 많이 노출시키지 않고 어떻게 수업을 더 작은 단위로 리팩터링 할 수 있는가"여야합니다. 대답은 "예를 들어, 인터페이스 세그먼테이션 원리를 고수하여"인터페이스를 간결하게 유지 "하는 것입니다. @DavidArno의 답변에서 IMHO 포인트 2입니다 (다른 답변에서 반복 할 필요가 없다고 생각합니다).