2009-03-15 3 views
5

코드를 개발하면서 일반적으로 클래스의 빌딩 블록 중 일부를 일반적으로 사적이라고하더라도 단위 테스트를 수행하려고합니다. 프로젝트 내부에 유닛 테스트가 있다면 "Friend"를 사용하여이 작업을 수행하고 정상적으로 사용할 수 있도록 함수를 비공개로 유지할 수 있습니다. 하지만 차라리 NUnit 테스트를 자체 프로젝트로 옮길 것입니다. 내가 원하는 효과를 얻으려면 어떻게해야합니까? 당신은 (쉽게) 테스트 테스트 프로젝트에서 개인 다른 프로젝트에서 방법하지만 내부 방법을 테스트하는 것은 매우 흔한 일 (VB에서 Friend가) InternalsVisibleToAttribute를 사용하지 않을 수VB .NET에서 개별 프로젝트의 개인 함수를 테스트하는 방법은 무엇입니까?

답변

11

. 이로 인해 Friend 구성원은 다른 어셈블리에서 액세스 할 수 있습니다.

분명히 C# 2에서 사용할 수 있지만 VB 9에서는 새로운 기능이었습니다 ... 이유는 확실하지 않지만 this blog post from Bart de Smet은 간단한 예입니다.

생산 어셈블리에 서명 한 경우 테스트 어셈블리에도 서명해야하므로 InternalsVisibleToAttribute 인수에 공개 키를 지정해야합니다. 자세한 내용은 this Stack Overflow answer을 참조하십시오.

+2

(이것은 위의 링크 된 코드 프로젝트 사이트에서 붙여), 그것이 비용/이익은 상쇄된다. VB는 C#과 InternalsVisibleTo보다 이름을 해석하는 방법이 매우 다르므로 이름 조회가 매우 복잡합니다. VB8에서는 너무 비싸 VB9로 떨어졌습니다. 우리는 실제로 VB10에서 (cont) – JaredPar

+0

(cont) 계정에 대한 이름 변경을 추가로 변경하고 있습니다. – JaredPar

+0

이 대답에 감사드립니다 –

3

Reflection을 사용하여 개인 메소드를 호출 할 수 있습니다. 이 작업을 수행 할 샘플이 많이 있습니다. 빠른 구글 검색에서

+0

그리고 이것은 나를 가장 많이 도왔습니다. http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

기본 사항 :이 VB9의 새로운 이유에 관해서는

 public static object RunStaticMethod(System.Type t, string strMethod, 
    object [] objParams) 
    { 
     BindingFlags eFlags = 
     BindingFlags.Static | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     null, aobjParams, eFlags); 
    } //end of method 

    public static object RunInstanceMethod(System.Type t, string strMethod, 
    object objInstance, object [] aobjParams) 
    { 
     BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     objInstance, aobjParams, eFlags); 
    } //end of method 

    private static object RunMethod(System.Type t, string 
    strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
    { 
     MethodInfo m; 
     try 
     { 
      m = t.GetMethod(strMethod, eFlags); 
      if (m == null) 
      { 
       throw new ArgumentException("There is no method '" + 
        strMethod + "' for type '" + t.ToString() + "'."); 
      } 

      object objRet = m.Invoke(objInstance, aobjParams); 
      return objRet; 
     } 
     catch 
     { 
      throw; 
     } 
    } //end of method 
관련 문제