> 백엔드 개발 > C++ > 런타임 오류를 방지하면서 C#에서 비공개 메서드를 효과적으로 단위 테스트하려면 어떻게 해야 합니까?

런타임 오류를 방지하면서 C#에서 비공개 메서드를 효과적으로 단위 테스트하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2025-01-18 21:38:10
원래의
281명이 탐색했습니다.

How Can I Effectively Unit Test Private Methods in C# While Avoiding Runtime Errors?

C#에서 비공개 메서드 단위 테스트의 어려움

C#의 비공개 메서드 단위 테스트는 캡슐화된 특성으로 인해 까다로울 수 있습니다. Visual Studio에서는 자동으로 생성된 접근자 클래스를 제공하지만 테스트 중에 런타임 오류가 계속 발생할 수 있습니다.

코드 예제 및 테스트 사례

다음 코드 조각과 해당 테스트를 고려하세요.

<code class="language-csharp">// 被测试单元
class TypeA
{
    private List<TypeB> myList = new List<TypeB>();
    private void MyFunc() { /* 忽略处理过程 */ }
}

// 单元测试
public void MyFuncTest()
{
    TypeA_Accessor target = new TypeA_Accessor();
    target.myList.Add(new TypeA_Accessor.TypeB());
    target.MyFunc();
}</code>
로그인 후 복사

런타임 오류

컴파일에 성공했지만 유형 변환 문제로 인한 런타임 오류:

<code>无法将类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' 的对象转换为类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]' 的对象。</code>
로그인 후 복사

근본 원인은 target이 예상된 TypeA_Accessor이 아닌 TypeA 유형이기 때문입니다. 이 불일치로 인해 변환이 실패합니다.

솔루션

.NET Core 2.0 이전

개인 메서드와 필드에 액세스하려면 PrivateObject 클래스를 사용하세요.

<code class="language-csharp">PrivateObject target = new PrivateObject(new TypeA());
var retVal = target.Invoke("MyFunc");</code>
로그인 후 복사

.NET Core 2.0 이상

PrivateObject 클래스는 더 이상 지원되지 않습니다. 대안은 테스트 목적으로 개인 메서드를 internal으로 설정하거나 개인 메서드를 테스트할 필요가 없도록 코드를 리팩토링하는 것입니다.

위 내용은 런타임 오류를 방지하면서 C#에서 비공개 메서드를 효과적으로 단위 테스트하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿