2014-06-19 4 views
-2

다른 솔루션을 본 후에 개인 메서드를 테스트하기 위해 다음 코드를 사용했지만 작동하지 않습니다. 컴파일 오류.단위 테스트 개인 메서드

FooClass target = new FooClass(DBContext, null, null, null, null) 
PrivateObject privObj = new PrivateObject(target); 
var actual = privObj.Invoke("privateFoo", fooParam); 

개인 메서드는 개체의 하나의 매개 변수를받습니다. 매개 변수 객체는 이전에 사용되었으며 다른 메소드에서도 테스트에 사용되었습니다. 그래서 나는 그것에 대해 확신합니다. 그리고 개인 메서드는 내가 통과하는 null 객체를 사용하지 않습니다. 의존성 없음. 단위 테스트 개인 방법에 다른 방법이 있는지 알고 싶거나 뭔가 빠졌습니다. 다른 사람이 말했듯이 당신이 당신의 테스트

+2

코드가 "작동하지 않는 방법"에 대해 자세히 설명 할 수 있습니까? 당신은 무엇을 기대하고 있었고 실제로 무슨 일이 일어 났습니까? 예외가 발생하면 발생한 행을 게시하고 예외 세부 사항을 게시하십시오. – gunr2171

+2

단위 테스트 프레임 워크를 사용하고 있습니까? 일반적으로 개인 메서드에서 리플렉션을 사용하는 것보다 코드를 테스트하는 더 좋은 방법이 있습니다. 왜 사적인 것들을 사용하는 public 메소드를 테스트하지 않겠습니까? http://stackoverflow.com/questions/9122708/unit-testing-private-methods-in-c-sharp – xDaevax

+0

가능한 복제본 [어떻게 단위 테스트 개인 메서드를합니까?] (http://stackoverflow.com/questions/) 250692/how-do-you-unit-test-private-methods) –

답변

0

당신은 어쨌든 당신이 protected internal 개인 방법을 만들 수있는 공개하지 방법을 테스트하지 않아야, 당신은, InternalsVisibleToAttribute 라이브러리를 표시 테스트 개인 메서드를해서는 안됩니다. 공용 메서드는 클래스의 표시 가능한 API를 나타내므로 공용 메서드 만 테스트하려고합니다. 개인 메소드는 구현 세부 사항입니다. 이 예에서

public IEnumerable<Foo> GetValidCustomers() 
{ 
    var customers = _database.GetCustomers(); 
    return this.FilterToValidCustomers(customers); 
} 
private IEnumerable<Foo> FilterToValidCustomers(IEnumerable<Foo> customers) 
{ 
    //crazy complex logic here 
} 

, 당신은 당신이 유효한 고객의 정확한 세트를 얻을 수 있는지 테스트 할 것 :

는의는이 같은 방법이 있다고 가정하자. 고객 목록을 필터링하는 데 사용하는 논리는 예상 한 데이터를 가져 오는 한 관련성이 없습니다.

클래스의 공용 API를 통해 완전히 테스트하는 데 어려움이있는 매우 복잡한 논리가 개인 메서드에있는 경우 클래스에 디자인 문제가 있음을 나타냅니다. 클래스가 너무 복잡합니다. 복잡한 클래스를 여러 개의 작은 클래스로 분해 한 다음 공용 API를 통해 정상적으로 테스트해야합니다.

2

을하여 내부 방법 보호에 액세스 할 수 있도록

관련 문제