programing

C# 유닛 테스트 시 "내부" 액세스 한정자

padding 2023. 5. 8. 21:56
반응형

C# 유닛 테스트 시 "내부" 액세스 한정자

제가 더 많은 것을 사용해야 하는지 알아보려고 합니다.internal액세스 한정자입니다.

만약 우리가 사용한다면 나는 알고 있습니다.internal 조립 변수를 합니다.InternalsVisibleTo우리는 테스트 프로젝트에서 공개적으로 선언하고 싶지 않은 기능을 테스트할 수 있습니다.

이것은 제가 항상 사용해야 한다는 생각을 하게 합니다.internal왜냐하면 적어도 각 프로젝트는 (해야 합니까?)자체 테스트 프로젝트가 있습니다.

왜 이렇게 하면 안 되는 거지?언제 사용해야 합니까?private?

내부 클래스를 테스트해야 하며 어셈블리 속성이 있습니다.

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

합니다. Properties\AssemblyInfo.cs테스트 중인 프로젝트의 경우.이 경우 "MyTests"가 테스트 프로젝트입니다.

Eric의 답변에 추가하여 다음과 같이 구성할 수 있습니다.csproj파일 이름:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>MyTests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

, 에서 이런 것을 할 수 있습니다.Directory.Build.props파일 이름:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Test</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

참조: https://stackoverflow.com/a/49978185/1678053
예: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12

개인 방법을 테스트하려면 다음을 확인하십시오.PrivateObject그리고.PrivateType에 시대에Microsoft.VisualStudio.TestTools.UnitTesting네임스페이스입니다.그들은 필요한 반사 코드 주위에 사용하기 쉬운 포장지를 제공합니다.

문서: 개인 문서유형, 개인 개체

VS 2017 및 2019의 경우 MSTest를 다운로드하여 확인할 수 있습니다.테스트 프레임워크 너짓

부터 부터 시작하여넷 5, 당신은 또한 이 구문을 사용할 수 있습니다.csproj테스트 중인 프로젝트 중:

  <ItemGroup>
    <InternalsVisibleTo Include="MyProject.Tests" />
  </ItemGroup>

는 중용사를 합니다..NET Core 3.1.101 리고그고..csproj제게 도움이 된 추가 사항은 다음과 같습니다.

<PropertyGroup>
  <!-- Explicitly generate Assembly Info -->
  <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
</PropertyGroup>

<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
  <_Parameter1>MyProject.Tests</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>

기본적으로 개인 정보를 계속 사용합니다.구성원이 해당 유형을 초과하여 노출되지 않아야 하는 경우 해당 유형을 초과하여 동일한 프로젝트 내에서도 노출되지 않아야 합니다.이렇게 하면 개체를 사용할 때 어떤 방법을 사용할 수 있는지 더 명확하게 알 수 있습니다.

그렇기는 하지만 자연사적인 방법을 시험 목적으로 내부적으로 만드는 것이 합리적이라고 생각합니다.저는 그것을 리팩터링 비우호적인 반사를 사용하는 것보다 선호합니다.

한 가지 고려해야 할 사항은 "ForTest" 접미사일 수 있습니다.

internal void DoThisForTest(string name)
{
    DoThis(name);
}

private void DoThis(string name)
{
    // Real implementation
}

그러면 동일한 프로젝트 내에서 클래스를 사용할 때 이 방법을 실제로 사용해서는 안 된다는 것은 명백합니다. 이 방법은 테스트 목적으로만 사용됩니다.제가 직접 하는 것은 아니지만, 적어도 고려해 볼 가치는 있습니다.

개인적인 방법도 사용할 수 있으며, 반성과 함께 개인적인 방법을 호출할 수 있습니다.Visual Studio Team Suite를 사용하는 경우 개인 메서드를 호출하는 프록시를 생성하는 몇 가지 기능이 있습니다.다음은 사용자가 직접 작업을 수행하여 개인 및 보호된 메서드를 단위로 테스트하는 방법을 보여주는 코드 프로젝트 문서입니다.

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

어떤 접근 수식어를 사용해야 하는지에 대해 제 일반적인 경험칙은 비공개로 시작하여 필요에 따라 에스컬레이션하는 것입니다.그렇게 하면 수업의 내부 세부 정보를 실제로 필요한 만큼 적게 노출할 수 있으며 구현 세부 정보를 숨겨두는 데 도움이 됩니다.

.NET core의 경우 [assembly:]로 네임스페이스에 속성을 추가할 수 있습니다.InternalVisibleTo("MyUnitTestsAssemblyName")], 예를 들어 다음과 같습니다.

using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Applications.ExampleApp.Tests")]
namespace Applications.ExampleApp
 internal sealed class ASampleClass : IDisposable
    {
        private const string ApiVersionPath = @"api/v1/";
        ......
        ......
        ......
        }
    }

.NET Core 2.2에서 다음 행을 Program.cs 에 추가합니다.

using ...
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("MyAssembly.Unit.Tests")]

namespace
{
...

더하다InternalsVisibleTo.cs프로젝트의 루트 폴더에 파일을 저장합니다..csproj서류철이 있음

의 내용InternalsVisibleTo.cs따라야 합니다.

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("AssemblyName.WhichNeedAccess.Example.UnitTests")]

언급URL : https://stackoverflow.com/questions/358196/c-sharp-internal-access-modifier-when-doing-unit-testing

반응형