단위 테스트 목적으로 다른 어셈블리의 클래스에 액세스하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
나는 Visual-Studio 2008 방식을 단위 테스트하는 데 뛰어 들고 있으며, 교차 조립을 달성하는 가장 좋은 방법이 궁금합니다. class
테스트 목적으로 액세스.
기본적으로 하나의 솔루션에 두 개의 프로젝트가 있습니다.
- myproject (c#)
- MyProjectTests (C# 테스트 프로젝트)
MyProject의 모든 것은 현재 기본 접근성을 가지고 있습니다. 내가 올바르게 기억한다면 모든 것이 효과적으로 있음을 의미합니다. internal
. 나는 주로 테스트를 찾고 있습니다 class
레벨이지만 몇 개가 있습니다 delegates
관련된.
미래에는 언젠가 외부 API가있을 것이지만, 나는 완료하는 방법의 약 20% (적어도 종이에)이 테스트되지 않은 코어 위에 더 많은 코드를 레이어링하는 데 꽤 많은 것을 얻고 있습니다. 따라서 앱이 전통적인 (읽기 : 나쁜 및/또는 게으른) 기능 테스트를 위해 충분히 완료되기 전에 지금 몇 가지 테스트를 수행하고자합니다.
정답 외에도 솔루션의 예를 크게 높이 평가할 것입니다.
해결책
어셈블리 레벨 속성을 사용할 수 있습니다 InternalSvisibleToattribute 이것을 달성하기 위해.
추가하다
[assembly:InternalsVisibleTo("MyProjectTests")]
MyProject 어셈블리에서 AssemblyInfo.cs에.
다른 팁
메인 프로젝트의 AssemblyInfo.cs에 속성을 추가하여 내부 방법을 테스트하여 이름의 어셈블리에 내부 메소드에 액세스 할 수 있습니다.
어셈블리 : InternalSvisIbleto ( "MyProjectTestSnamespace.myProjectTests")
추가 정보입니다 여기
추가해야합니다
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
"myProject (c#)"의 AssemblyInfo.cs에. 그런 다음 테스트에서 테스트를위한 내부 방법에 액세스 할 수 있습니다.
당신이 필요한 것 같습니다 InternalSvisibleToattribute
그러나이 접근법에 대해 권장합니다. 공개 인터페이스 또는 API를 통해 내부 클래스를 테스트하십시오.
하지만 [InternalsVisibleTo]
가장 현명한 방법 IMO는 다음과 같은 다른 방법이 있습니다.
사용하여 반사
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
이 접근법의 문제점은 메소드 이름 또는 서명이 변경되면 단위 테스트가 실행 시간에 실패하는 반면 [InternalsVisibleTo]
컴파일 시간 에이 중단 변화를 쉽게 선택했을 것입니다.
- 같은 테스트 프레임 워크를 사용하십시오
Moles / Fakes
또는TypeMock
나는 이것을 찾았다 https://msdn.microsoft.com/en-us/library/hh598957.aspx 누군가를 도울 수 있기를 바랍니다.
요약:
- 단위 테스트 프로젝트에서 테스트중인 코드에 대한 참조를 추가하십시오. 동일한 솔루션에서 코드 프로젝트에 대한 참조를 만드는 방법은 다음과 같습니다.
- Solution Explorer에서 프로젝트를 선택하십시오.
- 프로젝트 메뉴에서 참조 추가를 선택하십시오 ....
- 참조 관리자 대화 상자에서 솔루션 노드를 열고 프로젝트를 선택하십시오.
- 코드 프로젝트 이름을 확인하고 대화 상자를 닫습니다.