2012-08-03 3 views
2

필자는 ASP.NET 응용 프로그램에 대한 빠르고 간단한 유닛 테스트 프레임 워크를 사용합니다. 예상되는 결과와 실제 결과를 비교하고 테이블을 만드는 ASPX 페이지입니다. 필요에 따라 컴파일되며 VS.NET을 실행하지 않아도 신속하게 수많은 테스트를 만들고 실행할 수 있습니다. 당신이 상상할 수 있듯이스택 추적으로 실제 코드 줄을 검색 할 수 있습니까?

PrintResult(
    expected: "$A$1", 
    actual: RST.ExcelReference.FormatReferences("{{REF:1:0:1:0}}", false, 0, 0), 
    arguments: "RST.ExcelReference.FormatReferences(\"{{REF:1:0:1:0}}\", false, 0, 0)"); 

(. 명명 된 인수가 명확성을 위해 추가)

에서, 실제 호출하고 호출의 표시를 동기화하는 것은 고통이다 : 여기

는 예를 들어 전화입니다 .

Environment.StackTrace의 인수 값을 검사 할 수 없다는 것을 알고 있습니다. 메서드 정의와 행 번호 만 있습니다. 하지만 제 경우에는 인수 값을 필요로하지 않습니다. 필자는 일반적으로 리터럴을 인수로 사용하여이 메서드를 호출하므로 Stack Trace의 PrintResult()에 대한 진입 점의 소스 코드 줄이 필요합니다.

처리되지 않은 예외가있을 때 나타나는 것처럼 ASP.NET에 소스 코드가 사용 가능한 것 같습니다. 어떻게 접근 할 수 있습니까?

답변

1

Environment.StackTrace은 스택 추적의 각 줄에 파일 이름과 줄 번호를 제공합니다. 명확하게 형식이 지정되어 있으며 쉽게 파싱 할 수 있어야합니다. the documentation에서 :

을 "파일 이름에 FullClassName methodName로 (MethodParams)에서 :. 라인 LINENUMBER"

문자 적에게 다음과 같이

스택 트레이스 속성은 각 메소드 호출 스택 추적 정보를 포맷 "at"앞에 세 개의 공백이 있으며 디버그 기호를 사용할 수 없으면 "in" 및 ": line"리터럴이 생략됩니다. 다음과 같이 자리, FullClassName, methodName로, MethodParms, 파일 이름 및 LINENUMBER은 정의 실제 값으로 대체됩니다

네임 스페이스를 포함하여 클래스의 전체 이름을 FullClassName.

메서드 이름 메서드의 이름입니다.

매개 변수 유형/이름 쌍의 목록입니다. 각 쌍은 쉼표 (",")로 구분되어 입니다. MethodName 에 매개 변수가없는 경우이 정보는 생략됩니다.

FileName MethodName 메서드가 인 원본 파일의 이름입니다. 디버그 기호가 이 아닌 경우이 정보는 생략됩니다.

LineNumber 호출 스택에있는 명령어의 MethodName 코드에서 코드를 포함하는 FileName 행의 번호입니다. 디버그 기호를 사용할 수없는 경우이 정보는 생략됩니다.

질문에서 당신은 Environment.StackTrace이 질문에 대한 대답은 아니라는 것을 암시하지만, 다음, 소스 파일 이름과 라인 번호를 구문 분석 파일에서 해당 라인을 읽어 갈 수있을 것처럼 보인다. 내가 뭘 놓치고 있니?

+0

이것은 정확히 지금까지 내가 ASPX의 소스 코드 (Request.PhysicalPath)를 문자열 목록으로 읽고 프레임의'GetFileLineNumber() - 1'에 대한 행을 인쇄하는 것입니다. 소스 코드를 직접 읽는 것이 이상하게 보였으므로보다 우아한 방법이있을 수 있다고 생각했습니다. (실제로'Environment.StackTrace' 대신'new System.Diagnostics.StackTrace (true)'를 사용하고 있으므로 문자열을 파싱 할 필요가 없습니다.) – richardtallent

관련 문제