예, SOLID는 쉽게 테스트 할 수있는 코드를 설계하는 매우 좋은 방법입니다. 짧은 입문서로서 :
S-단일 책임 원칙 : 객체는 정확히 한 가지 일을 수행해야하며 코드베이스에서 그 일을하는 유일한 객체 여야합니다. 예를 들어 인보이스와 같은 도메인 클래스를 선택하십시오. 송장 클래스는 시스템에서 사용되는 송장의 데이터 구조 및 비즈니스 규칙을 나타내야합니다. 코드베이스에서 송장을 나타내는 유일한 클래스 여야합니다. 이것은 메소드가 하나의 목적을 가져야하며 코드베이스 에서이 요구를 충족시키는 유일한 방법이어야한다고 말하기 위해 더 세분화 될 수 있습니다.
이 원칙을 따르면 다른 개체에서 동일한 기능을 테스트하기 위해 작성해야하는 테스트 수를 줄임으로써 디자인의 테스트 가능성을 향상시킬 수 있으며 일반적으로 더 작은 기능을 테스트하여 더 쉽게 테스트 할 수 있습니다.
O- 개방 / 폐쇄 원칙 : 클래스는 확장에 개방되어 있지만 변경하려면 폐쇄해야합니다 . 객체가 존재하고 올바르게 작동하면 이상적으로 해당 객체로 돌아가서 새로운 기능을 추가하는 변경 작업을 수행 할 필요가 없습니다. 대신, 새로운 기능을 제공하기 위해 객체를 파생 시키거나 새로운 또는 다른 종속성 구현을 연결하여 객체를 확장해야합니다. 이것은 회귀를 피합니다. 이미 다른 곳에서 사용되는 객체의 동작을 변경하지 않고도 필요할 때 언제 어디서나 새로운 기능을 도입 할 수 있습니다.
이 원칙을 준수하면 일반적으로 "모의 (mock)"를 허용하는 코드의 기능이 향상되고 새로운 동작을 예상하기 위해 테스트를 다시 작성하지 않아도됩니다. 개체에 대한 모든 기존 테스트는 확장되지 않은 구현에서 계속 작동해야하며 확장 구현을 사용하는 새로운 기능에 대한 새로운 테스트도 작동해야합니다.
L-Liskov 대체 원칙 : 클래스 B에 따라 A 클래스는 차이를 몰라도 X : B를 사용할 수 있어야합니다. 이것은 기본적으로 종속성으로 사용하는 모든 항목이 종속 클래스에서 볼 수있는 것과 유사한 동작을 가져야 함을 의미합니다. 간단한 예로, ConsoleWriter로 구현 된 Write (string)를 노출하는 IWriter 인터페이스가 있다고 가정합니다. 이제 파일에 대신 써야하므로 FileWriter를 만듭니다. 그렇게 할 때, FileWriter가 ConsoleWriter와 같은 방식으로 사용될 수 있는지 확인해야합니다 (의존자가 상호 작용할 수있는 유일한 방법은 Write (string)를 호출하는 것 뿐이므로). FileWriter가이를 수행해야하는 추가 정보 작업 (예 : 경로 및 파일 쓰기)은 부양 가족이 아닌 다른 곳에서 제공해야합니다.
LSP를 준수하는 디자인은 예상되는 동작을 변경하지 않고 언제라도 실제 객체 대신 "모의 된"객체를 대체 할 수 있기 때문에 테스트 가능한 코드를 작성하는 데 큰 도움이됩니다. 그러면 시스템이 연결된 실제 객체와 함께 작동합니다.
I- 인터페이스 분리 원리 : 인터페이스는 인터페이스에 의해 정의 된 역할의 기능을 제공하기 위해 가능한 한 적은 방법을 가져야합니다 . 간단히 말해, 더 작은 인터페이스가 더 작은 인터페이스보다 낫습니다. 큰 인터페이스에는 변경해야 할 이유가 더 많기 때문에 코드베이스의 다른 곳에서는 필요하지 않은 변경이 더 많이 발생하기 때문입니다.
ISP를 준수하면 테스트중인 시스템의 복잡성과 해당 SUT의 종속성이 줄어들어 테스트 가능성이 향상됩니다. 테스트중인 객체가 DoOne (), DoTwo () 및 DoThree ()를 노출하는 IDoThreeThings 인터페이스에 의존하는 경우 객체가 DoTwo 메소드 만 사용하더라도 세 가지 메소드를 모두 구현하는 객체를 조롱해야합니다. 그러나 객체가 IDoTwo에만 의존하는 경우 (DoTwo 만 노출) 해당 방법이있는 객체를 더 쉽게 조롱 할 수 있습니다.
D- 종속성 역전 원리 : 생성 과 추상화는 다른 생성에 의존해서는 안되며 추상화에 의존해서는 안된다 . 이 원리는 느슨한 결합의 신조를 직접 시행합니다. 객체는 객체가 무엇인지 알 필요가 없습니다. 대신 객체가하는 일을 신경 써야합니다. 따라서 객체 또는 메소드의 속성 및 매개 변수를 정의 할 때 인터페이스 및 / 또는 추상 기본 클래스를 사용하는 것이 구체적인 구현을 사용하는 것보다 항상 선호됩니다. 따라서 사용법을 변경하지 않고도 한 구현을 다른 구현으로 바꿀 수 있습니다 (DIP와 함께 사용되는 LSP도 따르는 경우).
다시 한 번, 테스트 할 개체에 "생산"구현 대신 종속성의 모의 구현을 주입 할 수 있기 때문에 테스트 가능성이 매우 높습니다. 생산에서. 이것이 "단독"단위 테스트의 핵심입니다.