2012-05-11 6 views
1

나는 가난한 사람의 테스트 프레임 워크를 쓰고있다. 내 콘솔 응용 프로그램에서, 나는이 있습니다 TestingFramework 내StackTrace에서 올바른 줄 번호를 얻으려면 어떻게해야합니까?

static void Main(string[] args) 
    {  // Line 12 
    double adouble = 77; 
    double expected = 70; 
    TestingFramework.assertEquals<double>(expected, adouble - 7); // Line 15 
    TestingFramework.assertEquals<double>(expected, adouble - 6); // Line 16 
    } 

나는이 라인이 :

System.Console.WriteLine("Success, File {0}, Line {1}", 
    new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileName(), 
    new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileLineNumber()); 

을하지만 테스트를 실행할 때 FileLineNumber 모두 함수 호출에 대한 12입니다, 그것은 나에게 말한다. 또한 올바른 파일 이름을 제공하므로 올바른 프레임을 참조하고 있다고 생각합니다.

통화를 시작한 회선 번호 (15와 16) 및 열린 괄호 (12)의 회선 번호를 알려주는 방법을 누군가에게 알려줄 수 있습니까?

감사합니다. 나는이 문제를 알아 낸

foreach(var frame in StackTrace.GetFrames()) 
    { 
     System.Reflection.MethodBase method = frame.GetMethod (); 
     Type type = method.DeclaringType; 
     // If this is what I am looking for 
     if (type.IsSubclassOf(typeof(TestClassBase)) || type != typeof (TestClassBase)) 
     { 
      System.Console.WriteLine("Success, File {0}, Line {1}", frame.GetFileName(), frame.GetFileLineNumber()); 
      return; 
     } 
    } 
+0

특정 유형의 클래스 또는 식별자가있는 클래스를 찾으려고 스택을 걸어 갈 수 있습니다. 메서드와 그 소유자를보고 프레임을 반복합니까? 그냥 생각해. –

+0

@ 한스 패 탄트 : 내 타이틀을 향상 시켜줘서 고마워. – philologon

답변

1

같이, 내 댓글에 무언가를 덧붙이.

나는 TestingFramework에 assertequals 기능을 오버했다 : 1) assertEquals (T expectedValue를, T actualValue) 및 2) assertEquals (T expectedValue를, T actualValue, 문자열 주석).

클라이언트 코드가 2-param 함수를 호출하면 해당 함수는 3-param 함수를 호출합니다. 이 프레임의 깊이는 호출 방법에 따라 다릅니다.

그래서 나는 종료 할 때 함수 및 감소를 입력 할 때 내가 증가

static int depth; 

를 추가했다. 그러면 코드가 다음과 같이 변경됩니다.

new System.Diagnostics.StackTrace(true).GetFrame(depth).GetFileLineNumber()); 

이제는 작동합니다.

+0

어디에서 답을 얻을 수 있습니까? – philologon

+0

@philologon : 그는 자신이 찾고있는 클래스에 속한 스택 프레임에서 라인 번호를 얻을 수 있습니다. –

관련 문제