Development Tip

C # 보호 메서드 단위 테스트

yourdevel 2020. 12. 15. 19:54
반응형

C # 보호 메서드 단위 테스트


저는 Java EE 세계에서 왔지만 지금은 .Net 프로젝트를 진행하고 있습니다. Java에서는 보호 된 메서드를 테스트하고 싶을 때 매우 쉬웠습니다. 동일한 패키지 이름의 테스트 클래스 만 있으면 충분했습니다.

C #과 비슷한 것이 있습니까? 보호 된 메서드를 단위 테스트하는 좋은 방법이 있습니까? 나는 단지 공개적인 방법만을 테스트해야한다고 말하는 프레임 워크와 사람들을 찾았다.

프레임 워크 없이도 가능해야합니다…


테스트 클래스에서 테스트중인 클래스를 상속 할 수 있습니다.

public class Test1 : SomeClass
{
    Asert.AreEqual(1, SomeClass.ProtectedMethod());
}

또 다른 옵션은 internal이러한 메서드를 사용한 다음을 사용 InternalsVisibleTo하여 테스트 어셈블리가 이러한 메서드에 액세스 할 수 있도록하는 것입니다. 이것은 동일한 어셈블리의 다른 클래스에서 사용되는 메서드를 중지하지 않지만 테스트 어셈블리가 아닌 다른 어셈블리에서 액세스하는 것을 중지합니다.

이것은 많은 캡슐화와 보호 기능을 제공하지는 않지만 매우 간단하고 유용 할 수 있습니다.

AssemblyInfo.cs내부 메서드를 포함하는 어셈블리에 추가

[assembly: InternalsVisibleTo("TestsAssembly")]

테스트 할 클래스를 상속하는 새 클래스에서 보호 된 메서드를 노출 할 수 있습니다.

public class ExposedClassToTest : ClassToTest
{
    public bool ExposedProtectedMethod(int parameter)
    {
        return base.ProtectedMethod(parameter);
    }
}

PrivateObject 클래스를 사용하여 모든 private / protected 메서드 / 필드에 액세스 할 수 있습니다.

PrivateObject는 단위 테스트를 위해 일반적으로 액세스 할 수없는 멤버를 호출 할 수있는 래퍼 인 Microsoft 단위 테스트 프레임 워크의 클래스입니다.


리플렉션을 사용하여 개인 및 보호 메서드를 호출 할 수 있습니다.

자세한 내용은 여기를 참조하십시오.

http://msdn.microsoft.com/en-us/library/66btctbe.aspx


받아 들인 대답이 가장 좋은 대답이지만 내 문제를 해결하지 못했습니다. 보호 된 클래스에서 파생 된 것은 다른 많은 것들로 내 테스트 클래스를 오염 시켰습니다. 결국 나는 테스트 할 로직을 공개 클래스로 추출하여 테스트하기로 결정했습니다. 확실히 이것은 모든 사람에게 작동하지 않으며 상당한 리팩토링이 필요할 수 있지만이 답변까지 스크롤하면 도움이 될 수 있습니다. :) 여기에 예가 있습니다.

이전 상황 :

protected class ProtectedClass{
   protected void ProtectedMethod(){
      //logic you wanted to test but can't :(
   }
}

새로운 상황 :

protected class ProtectedClass{
   private INewPublicClass _newPublicClass;

   public ProtectedClass(INewPublicClass newPublicClass) {
      _newPublicClass = newPublicClass;
   }

   protected void ProtectedMethod(){
      //the logic you wanted to test has been moved to another class
      _newPublicClass.DoStuff();
   }
}

public class NewPublicClass : INewPublicClass
{
   public void DoStuff() {
      //this logic can be tested!
   }
}

public class NewPublicClassTest
{
    NewPublicClass _target;
    public void DoStuff_WithoutInput_ShouldSucceed() {
        //Arrange test and call the method with the logic you want to test
        _target.DoStuff();
    }
}

참조 URL : https://stackoverflow.com/questions/13416223/unit-testing-c-sharp-protected-methods

반응형