액세스 한정자가 Internal 메서드를 단위 테스트하는 방법
5021 단어 VisualStudioC#
그러나 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
부분 마다는 검색에 걸리는 정보이지만, 정리해 쓰여져 있는 기사가 눈에 띄지 않았기 때문에 정리해 보았다.
Reference
이 문제에 관하여(액세스 한정자가 Internal 메서드를 단위 테스트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bearbutler/items/43e0099f6655ca9b246c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)