2016-06-10 4 views
0

내부 클래스가있는 C# 프로젝트 라이브러리 DLL이 있으며 단위 테스트를 수행하려고합니다. 가능한 경우 리플렉션을 사용하여 참조를 가져 와서이 내부 클래스를 단위 테스트하고 싶습니다.리플렉션을 사용하여 라이브러리에있는이 내부 클래스의 메서드를 호출하려면 어떻게해야합니까?

namespace ProjectA.B.C 
{ 
    class Caching 
    { 
     public static void DoWork() { } 
    } 
} 

가 어떻게 ProjectA를 사용하는 다른 프로젝트에서 반사를 사용하여 DoWork 메소드를 호출 할 수 있습니다

나는이 수업을? 나는 시도했다, 그러나 나의 첫번째 문제점은 typeof(ProjectA.B.C.Caching)가 보호된다 그래야 나는 아직 유형 참조를 얻는 것을조차 보이지 않는다, 그러나 나는 방법다는 것을 확실하다.

오류 :

'ProjectA.B.C.Caching'액세스 할 수 없습니다 때문에 그 보호 수준

+0

내부적으로 보호되어 있지 않습니다. 그래도 Assembly.GetType을 사용할 수 있습니다. 아직 시도해 보셨습니까? –

+0

@JonSkeet 질문을 업데이트했지만 어셈블리 참조를 얻는 방법을 아직 모릅니다. – Alexandru

+0

wablab의 대답은 실제로 더 나은 접근법입니다. –

답변

2

당신은 당신의 단위 테스트 프로젝트에 내부 클래스를 볼 수 있도록하기 위해 InternalsVisibleToAttribute를 사용할 수 있습니다.

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx

+0

좋은 접근 방식, 작동 방식, 좋아합니다. 사용합니다. 아직도 대답 대답에 관심이 ...이 질문의 범위입니다. – Alexandru

+1

어셈블리 이름이 "ProjectA"라고 가정하면 다음을 수행 할 수 있습니다. var t = Type.GetType ("ProjectA.B.C.Caching, ProjectA"); var m = t.GetMethod ("DoWork"); m.Invoke (null, null); – wablab

0

다른 프로젝트 이름 ProjectA.B.C을 가지고 있으며, ProjectA.B.C라는 이름의 어셈블리를 내뿜으며, 그것은 다음과 같은 방법 서명 다음과 같은 내부 클래스 구현 다음과 같은 네임 스페이스가있는 경우 :

namespace ProjectA.B.C 
{ 
    class Caching 
    { 
     public static bool GetOrSet<T>(string key, Func<T> getValue, out T value, TimeSpan? expiration = null) { 
      ... 
     } 
     public static bool Get<T>(string key, out T value) { 
      ... 
     } 
    } 
} 

을 단위 테스트를 위해 다음과 같이 호출 할 수 있습니다.

var type = Assembly.Load("ProjectA.B.C").GetTypes().First(x => x.Name.Equals("Caching", StringComparison.Ordinal)); 
var methods = type.GetMethods(); 
var getOrSetMethod = methods.First(x => x.Name.Equals("GetOrSet", StringComparison.Ordinal) && x.ReturnType.Name.Equals("Boolean", StringComparison.Ordinal)).MakeGenericMethod(typeof(bool)); 
var getMethod = methods.First(x => x.Name.Equals("Get", StringComparison.Ordinal)).MakeGenericMethod(typeof(bool)); 
var resultToSet = true; 
Func<bool> action =() => { return resultToSet; }; 
if (!(bool)getOrSetMethod.Invoke(null, new object[] { "GetOrSet", action, resultToSet, (TimeSpan?)null })) 
    throw new Exception("Could not set the GetOrSet key to a boolean value of true."); 
var parameters = new object[] { "GetOrSet", resultToSet }; 
if (!(bool)getMethod.Invoke(null, parameters)) 
    throw new Exception("Could not get back the GetOrSet key."); 
if ((bool)parameters[1] != true) 
    throw new Exception("Got the wrong GetOrSet key back."); 

T 그는 위의 방법을 보여줍니다 :

  • 일반 함수 매개 변수를 만듭니다.
  • MakeGenericMethod(params Type[] typeArguments)을 사용하여 제네릭으로 메서드를 호출합니다.
  • out 매개 변수로 메소드를 호출하고 결과에 대해 매개 변수 배열을 확인하십시오.
관련 문제