2012-02-26 2 views
1

많은 함수를 내부적으로 호출하는 함수가 있습니다. 튜토리얼에서 테스트 메서드는 외부 함수의 반환 값만 확인되는 방식으로 설계되어 있습니다. 어떻게 내부 함수에 의해 반환 된 값을 확인할 수 있습니다.nunit 테스트를 사용한 내부 함수 테스트

GetValues() 메서드 값만 테스트됩니다. GetValues() 내부의 다른 메소드의 작동을 어떻게 확인할 수 있습니까? 어떻게하면 단위 테스트를 사용하여 작동하는지 확인할 수 있습니까?

[TestFixture] 
    public class Class1 
    { 
     [Test] 
     public void Tester() 
     { 
      TesterClass clasObj; 
      int a = clasObj.GetValues(); 
      Assert.AreEqual(10,a); 
     } 
    } 
+0

나는 GetValues ​​()가 호출하는 메소드에 관심이 있다면 위의 코드가'GetValues ​​()'를 테스트하는 것처럼 테스트하는 테스트를 작성할 것이다. –

답변

1

난 당신이 TypeMock 같은 몇 가지 도구를 사용하여이 작업을 수행 할 수 있다고 생각하지만, 대부분의 도구는 그것을 허용하지 않는 이유가있다. 이는 대개 테스트가 매우 취약 해지기 때문에 클래스의 내부 코드를 변경하면 테스트가 중단된다는 의미입니다. 내부 구성원은 캡슐화되어야하며 이는 좋은 것입니다. 공용 인터페이스에서 테스트 할 수있는 디자인을 살펴볼 것입니다.

1

단위 테스트를 사용하여 작동 여부를 어떻게 확인할 수 있습니까?

단위 테스트에서는 테스트중인 단위뿐입니다. 이 경우 GetValues입니다. 또한 보통 공용 메서드 만 유닛 테스트를받습니다. 공용 메서드 (인터페이스) 일 뿐이므로 내부 작업이 아니라 테스트해야합니다.

또한 테스트가 취성이 없음을 보장합니다. 개인/내부 메소드가 작동하는 방식을 변경했지만 본질적으로 공용 인터페이스가 동일하게 작동하게하는 경우 (특히 모의 객체를 사용하는 경우 및 실제로 수행하는 테스트 유형이 아닌 경우), 실제로는 안됩니다 유닛 테스트에 실패했습니다.

이러한 경우에는 테스트 할 공용 메서드와 테스트중인 메서드에서 호출하는 개인/내부 메서드를 통해 모든 코드 경로를 단위 테스트가 포함하도록해야합니다.

간혹 내부를 테스트하려는 경우, InternalsVisibleToAttribute을 사용하고 테스트 어셈블리를 "친구"로 표시하는 것이 하나의 방법입니다.

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

또 다른 방법은 (아마도 테스트 어셈블리) 테스트 클래스를 서브 클래 싱하고 테스트 할 방법에 공공 래퍼 방법을 추가하고이 프록시 클래스와 테스트를위한 공공 래퍼를 사용하는 것입니다 .

+0

그냥 추가 : InternalsVisibleToAttribute를 사용하면 Internal로 표시된 다른 어셈블리의 클래스를 볼 수 있습니다. –

+0

IMO라는 코드 냄새가 유효하지만 테스트하기 위해 내부 항목으로 표시 중입니다. 이 작업을 수행해야하는 경우 누락 된 개체가 있습니다. – Finglas

+0

@Finglas - 나머지 답변을 놓치고 그 라인을 읽었습니까? – manojlds

1

일반적으로 코드의 내부 구현을 테스트하지 않으려는 경우가 있으므로 리팩터링을 통해 테스트를 중단 할 수 있습니다. 그러나 다른 객체의 내부를 테스트하려면 대답이 쉽습니다. 개인 구현을 테스트하려는 경우 코드의 냄새는 테스트중인 현재 객체가 너무 많은 작업을 수행하고 있다는 것입니다. 차례로 single responsibility principle과 같은 규칙을 위반합니다. 지금이 당신이 쉽게 테스트 할 수 있습니다 의미 공공 방법 public 클래스 될 것

ExampleFormatter.FormatValues() 

:

따라서 같은 테스트 할 수있는 새로운 객체로는 GetValues을 밖으로 분할합니다. GetValues은 이제 올바른 매개 변수를 사용하여 FormatValues을 호출해야합니다. mock object을 사용하여 예상대로 작동하는지 확인할 수 있습니다. 이것은 현재 공개되어 있으므로 값의 형식 지정과 같은 것을 테스트 할 수있는시기는 언제나 예상대로입니다. 일부 코드를 테스트하기가 어려울 때마다 코드가 너무 많이 수행된다는 것을 의미합니다.

관련 문제