액세스 한정자가 Internal 메서드를 단위 테스트하는 방법

5021 단어 VisualStudioC#
일반적으로 Visual Studio에서 테스트 할 수있는 것은 public에 공개 된 메서드뿐이며 internal 이상의 액세스 제한이 걸린 메서드에 대해 컨텍스트 메뉴에서 "단위 테스트 만들기"를 선택해도 "단일 테스트 만들기는 공용 클래스입니까? "공용 메서드 내에서만 지원됩니다."라는 경고가 나와 테스트를 만들 수 없습니다.

그러나 private 메소드만이라면 아직도 어셈블리내에서 다른 클래스로부터 불릴 가능성이 있는 internal 메소드에 관해서는 테스트를 실시하고 싶은 경우가 있는 것이 실정일 것이다.

Visual Studio에서는 테스트를 하고 싶은 메소드가 속하는 프로젝트의 AssemblyInfo에 InternalsVisibleTo를 추가함으로써 특정 프로젝트(지금의 경우 테스트 프로젝트)에 대해 internal 메소드의 이용을 허가하는 것이 가능하다.

AssemblyInfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("Test Target")]
[assembly: AssemblyDescription("")]
#if DEBUG
[assembly: InternalsVisibleTo("TestProject")]
#endif

이렇게 설명하면 internal 메서드를 단위 테스트에서 호출 할 수 있습니다. 다만, 컨텍스트 메뉴로부터의 작성은 역시 할 수 없기 때문에 테스트 클래스의 작성 등은 스스로 실시할 필요가 있는 경우가 있다.

여기서 #if DEBUG로 속성을 구하는 것은 테스트 시에만 이 속성이 사용되고 릴리스시에는 불필요한 어셈블리에 공개를 하지 않기 위한 배려이다.

이것으로 이야기가 완료된다면, internal 메소드의 테스트법 등으로 검색하는 것으로 정보를 간단하게 취득할 수 있지만, 테스트 대상 프로젝트가 「엄밀한 이름의 서명 첨부 어셈블리」였던 경우 "친구 어셈블리 참조"는 유효하지 않습니다. 엄격한 이름의 서명이 포함된 어셈블리는 해당 InternalsVisibleTo 선언 내에서 공개 키를 지정해야 합니다."라는 경고가 표시되고 빌드 오류가 발생합니다.
이것은 테스트 대상 프로젝트가 「엄밀한 이름의 서명 첨부 어셈블리」인 경우는 친구 어셈블리도 「엄밀한 이름의 서명 첨부 어셈블리」일 필요가 있다고 하는 제한이 있기 때문이다.
그렇다면 어떻게 테스트 프로젝트에 엄격한 이름을 서명 할 수 있습니까?

가장 간단한 방법은, 이미 사용되고 있는 테스트 대상 프로젝트로 사용되고 있는 「엄격한 이름의 키 파일」을 지정해, 테스트 프로젝트에 서명을 해 버리는 방법이다. (「엄격한 이름의 키 파일」의 작성으로부터 순서를 밟고 싶은 경우는 htps : // / cs. 미 c 로소 ft. 코 m / 자 jp / t t t / s 단지 rd / 아세 mbly / 를 참고)
TestTarget 프로젝트의 키 파일 (myproj_key.sn)을 테스트 프로젝트의 폴더에 복사하여 테스트 프로젝트의 속성을 열고 서명 탭에서 서명을 확인하면 테스트 프로젝트는 "엄격한 이름으로 서명 된 어셈블리"된다.

다음으로, 테스트 프로젝트의 공개 키를 취득할 필요가 있지만, 이것에는 VisalStudio의 「개발자 커멘드 프롬프트」를 이용한다.

일단 InternalsVisibleTo 속성을 주석 처리하고 테스트 프로젝트를 빌드 한 후 생성 된 테스트 프로젝트의 dll에 대해
sn -Tp <TestProject>.dll

실행하면


상기와 같은 결과가 얻어진다. 이 「공개 키」의 부분을 AssemblyInfo로 지정하면, 테스트 프로젝트에서 internal 메소드를 이용하는 것이 가능해진다.

AssemblyInfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("Test Target")]
[assembly: AssemblyDescription("")]
#if DEBUG
[assembly: InternalsVisibleTo("TestProject, PublicKey=<TestProjectの公開キー>")]
#endif

부분 마다는 검색에 걸리는 정보이지만, 정리해 쓰여져 있는 기사가 눈에 띄지 않았기 때문에 정리해 보았다.

좋은 웹페이지 즐겨찾기