일부 가정을 확인하고 해피 경로를 따르거나 불행한 경로를 따라 종료하는 방법이 있습니다. 나는 그것을 잘못 설계했거나 흐름 제어를 테스트하는 방법을 놓치고있다.유닛 테스팅 흐름 제어 패턴은 무엇입니까
if (this.officeInfo.OfficeClosed)
{
this.phoneCall.InformCallerThatOfficeIsClosedAndHangUp();
return;
}
if (!this.operators.GetAllOperators().Any())
{
this.phoneCall.InformCallerThatNoOneIsAvailableAndSendToVoicemail();
return;
}
Call call=null;
forach(var operator in this.operators.GetAllOperators())
{
call = operator.Call();
if(call!=null) {break;}
}
등등. 나는 내 의존성을 주입 시켰어. 나는 나의 mock moq'd를 얻었다. 나는 이것이 또는 그것이 불려지는지를 확신 할 수 있지만, "반환"이 어떻게되는지 테스트하는 방법을 모른다. 만약 TDD가 없으면 실패 할 때까지 줄을 쓰지 않는다는 의미입니다.
어떻게 테스트하나요? 아니면 그것을 더 테스트 할 수 있도록 작성하는 방법이 있습니까?
업데이트 : 몇 가지 대답은 결과 호출이 아닌 흐름 제어를 테스트해야한다고 말한 것입니다. 이 접근법에서 내가 가진 문제는 모든 테스트가 다른 테스트의 상태와 결과를 설정하고 테스트해야한다는 것입니다. 이것은 정말로 다루기 힘들고 부서지기 쉬운 것처럼 보입니다. 나는 첫 번째 if 절만을 테스트해서 두 번째 테스트를 단독으로 수행 할 수 없어야합니까? Method_WithParameter_DoesntInvokeMethod8IfMethod7IsTrueandMethod6IsTrueAndMethod5IsTrueAndMethod4IsTrueAndMethod3IsFalseAndMethod2IsTrueAndMethod1isAaaaccck()와 같이 시작되는 대수적으로 확장되는 테스트 집합이 정말로 필요합니까?
아마도 메서드가 너무 길어질 수 있습니다. –
"모든 테스트가 다른 테스트의 상태와 결과를 설정하고 테스트해야합니다"라는 것을 이해하지 못합니다. 각 테스트의 Te 길이는 코드 길이와 일치 할 수 있습니다. 'operator.Call'이 호출되었는지 확인하기 위해'officeInfo.OfficeClosed'가 false를 반환하고'operators.GetAllOperators(). Any()'가 true를 반환하는지 확인해야합니다. – ChrisW
무슨 뜻입니까? 후속 테스트는 초기 코드 행이 실행되었거나 실행되지 않았 음을 설정 및 확인해야합니다. 이것은 루틴이 끝나는 지점을 테스트하는 방법을 찾을 수 없기 때문에 필요합니다. Assert.DidReturnAtLine (3)이있는 경우 (물론 끔찍한 테스트가 될 것입니다), 입력 상태가 그 지점을 넘어서는 문장에 흐름을 전달하지 않았 음을 확신 할 수 있습니다. – JoshRivers