2012-04-12 3 views
3

테스트 방법?void 메서드를 테스트하는 방법은 조건이 만족하면 반환합니다

public void TestMethod() 
{ 
    if(aDenpendency.someMethod()) return; 

    // Followed by other logic.... 
} 

다음 논리에 다른 종속성이 없으므로 AssertWasNotCalled를 사용할 수 없습니다.

미리 감사드립니다.

+2

코드 예제에서 테스트 할 내용이 명확하지 않아서 전체 방법을 보여주고 자세한 정보를 제공하십시오. – sll

+0

@sll 나는 그가 'return'이라고 주장 할 수있는 방법을 묻고 있다고 생각합니다. 끝나는 시점에 반환되는 메서드가 아니라 void 메서드의 특정 시점에서 호출되었습니다. – Robbie

+0

@ Robbie : 감사합니다. – sll

답변

4

설명하는대로 테스트하는 것은 실수입니다. 그리고 가난한 코드 구조를 나타냅니다 그리고 명확한 코드 냄새, 당신은 리 팩터와 단위 테스트 코드, 당신이 테스트를 목표로 그것을 감안할 때 그것은 다음과 같이 호출되지 않았 음을 나타냅니다 당신이 또한 호출되었을 때 테스트를 원한다.

하나의 책임을지기 위해서는 더 합리적인 단위 테스트가 필요합니다. 반환 후에 논리를 가져올 수 있으며 메서드 및 단위 테스트에서 그 결과를 테스트 할 수 있습니다.

유닛 테스트는 가짜/위조로 예상 설정을 테스트하거나 작동 결과를 테스트해야한다는 것을 테스트하지 않습니다.

메서드가 호출 된 후에 개체의 상태를 테스트하는 테스트를 작성할 수 있지만이 테스트는 단위 테스트가 아니라 통합 테스트입니다. 즉, return 문이 실행 된 후에 다른 코드가 실행되지 않아야하므로 상태를 테스트 할 수 있으므로 수정되거나 처리되지 않은 내용이 수정되지 않습니다.

+0

예를 들어 테스트 할 때 아무 문제가 없습니다. 정렬 루틴은 스펙의 일부인 비교 함수를 올 Y 른 횟수만큼 호출합니다. 아니면'O (N^3)'행동을 감지하는 것이 좋을까요? –

+0

Ben 나는 당신이 불려지지 않은 것을 시험해서는 안된다고 말하고 있습니다. 또한 메소드 밖의 상태 인 플러스 테스트는 A.A.A 유닛 테스트 스타일 (Arrange Act Assert) 외부에서는 더 이상 결과의 코드 단위를 테스트하지 않으므로 더 많은 통합 테스트입니다.그것이 내가 당신의 요점을 정확하게 이해하는 경우입니다. –

+0

그리고 저는 뭔가 테스트가 잘못되었다고 말하고 있습니다. C#의 예제를 즉시 생각할 수는 없지만 C++에서는 큰 데이터 구조 인 경우 특정 함수가 인수의 복사본을 만들지 않는지 확인하고자 할 수 있습니다 (C++의 복사본은 비싼 경향이 있습니다). 깊은 사본). 아, 여기 있습니다 : C#에서는 캐시 된 결과를 기반으로 특정 메서드가 실행되는지 테스트하고 새 데이터베이스 쿼리를 발생시키지 않을 수 있습니다. –

0

테스트중인 메소드가 '실행 중 \ 처리 \ 중단됨'과 같은 '상태'속성을 설정하면 어떻게됩니까?

그래서 설정중인 테스트 상황에서 void 메소드를 호출 한 다음 나중에 속성을 확인하십시오. 반환; 상태 속성 설정은 코드에 함께 표시됩니다.

if(condition){ 
    _status = 1; //Or use an enumeration would be better 
    return; 
} 

테스트에서는 공용 접근을 통해 상태를 테스트합니다.

모든 경우에 적절하지 않을 수 있지만 내 클래스에 Process() 메소드가있는 클래스를 찾고 있습니다. 모의가 필요하지 않은 상태에서 테스트가 더 간단해질 수 있습니다. (스텁이 여전히 필요할 수도 있습니다.) 이전에 포스터에 동의합니다. 가능하면 더 나은 접근법)

나는 이것이 테스트를 허용하기 위해 코드를 작성하는 것처럼 느낄 수도 있지만, 특정 경우에는 코드 실행 중에 클래스의 상태를 확인하기 위해 public 속성을 사용할 것이다. 접근 방식은 전반적인 설계와 일치합니다.

관련 문제