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
'programing' 카테고리의 다른 글
빈 슬라이스를 초기화하는 올바른 방법 (0) | 2023.05.08 |
---|---|
AttributeError: 부분적으로 초기화된 모듈을 수정하는 방법? (0) | 2023.05.08 |
현재 메서드의 이름을 가져옵니다. (0) | 2023.05.08 |
UIScrollView를 콘텐츠에 맞게 자동 크기 조정하는 방법 (0) | 2023.05.08 |
문자열이 0이고 비어 있는지 확인합니다. (0) | 2023.05.08 |