하나의 공개 메소드 Send()
와 몇 개의 개인 메소드 가있는 클래스가 있습니다. 몇 가지 웹 서비스를 호출하고 응답을 처리합니다. 처리는 개인 방법으로 수행됩니다.
코드를 단위 테스트하고 싶습니다. 내 이해는 단위 테스트가 내 코드를 독립적으로 테스트해야한다는 것입니다 (즉, 공급 업체 응답 모의).
또한 개인 메소드를 단위 테스트 할 필요는 없다고 생각 하지만 Send () 메소드 만 테스트하면 코드가 별도로 테스트되지 않고 공급 업체 공진에 의존합니다.
그런 다음 모의 응답으로 테스트 할 수 있도록 개인 메서드를 공개해야합니까? 수업 만 불러야하기 때문에 나쁜 습관 인 것 같습니다.
기본적인 질문이라면 사과는 단위 테스트에 익숙하지 않습니다.
C #과 VS2010을 사용하고 있습니다.
답변
웹 서비스를 처리하는 코드 (예 : 데이터 송수신)를 결과 처리 코드와 분리해야합니다. 후자의 코드를 다른 클래스로 옮기고 필요한 메소드를 공개하십시오. 그런 다음 외부 종속성과 별도로 처리 로직을 쉽게 단위 테스트 할 수 있습니다.
이를 통해 코드가 단일 책임 원칙을 준수하게합니다 . 일반적으로 개인 메소드를 테스트 할 필요성을 느끼는 것은 종종 클래스가 너무 많은 책임을 가지고 있다는 것을 나타내므로 여러 클래스로 리팩토링해야합니다.
답변
이러한 의존성 테스트 ( 공급 업체 webservices 호출 )는 단위 테스트가 아닌 통합 테스트 라고 생각합니다 .
답변
다른 사람들이 말했듯이 단위 테스트에 웹 서비스 또는 데이터베이스 호출과 같은 외부 종속성이 있으면 단위 테스트가 아니며 통합 테스트입니다.
실제 단위 테스트는 테스트하려는 구성 요소 외에 외부 구성 요소와 독립적으로 실행될 수 있으며 환경에 관계없이 반복 가능해야합니다. 외부 웹 서비스가 중단되면 단위 테스트에 실패하지 않아야합니다.
우리는 Mocking Framework를 사용하여이 문제를 해결합니다. 모의 객체를 사용하면 단위 테스트의 구성 요소가 실제 모의 객체 대신이 모의 객체를 사용하도록 구성 요소 모의 객체를 만들 수 있습니다. 모의 객체를 테스트 가능한 구성 요소에 주입하고 예상되는 인수, 호출 할 때 반환 할 항목, 던지는 예외를 지정할 수 있습니다. 단위 테스트의 신뢰성과 독립성을 향상시킬 수 있으므로 주제에 대해 더 많이 읽으십시오.
다른 C # 조롱 프레임 워크에 대한 좋은 게시물은 다음 SO 스레드를 참조하십시오.
/programming/37359/what-c-mocking-framework-to-use
편집 : 명백히 민감한, 나는 테스트가 끝날 때 데이터베이스 변경을 롤백 할 수있는 DbUnit 또는 기타 트랜잭션 도구에 대해서는 언급하지 않았 음을 소유 할 것입니다. 이것 또한 반복 가능하며 생성 된 테스트 데이터로 환경에 구애받지 않으므로이 경우 Mocking Framework가 필요하지 않습니다.