2012-08-03 25 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中的參數值,只有方法定義和行號。但在我的情況下,我並不需要實際的參數值。我通常使用文字作爲參數來調用這個方法,所以我需要的就是堆棧跟蹤中PrintResult()入口點的源代碼行。

源代碼似乎以某種方式可用於ASP.NET,因爲它出現未處理的異常。我怎樣才能訪問它?

回答

1

Environment.StackTrace爲您提供堆棧跟蹤每一行中的文件名和行號。它格式明確,應該易於解析。從the documentation

棧跟蹤屬性格式對於每個 方法調用棧跟蹤信息如下:

「在FullClassName方法名(MethodParams)在文件名:線 LineNumber上」

字面「at」前面有三個空格,如果調試符號不可用,則省略「in」 和「:line」中的文字。該佔位符 ,FullClassName,方法名,MethodParms,文件名和 LineNumber上,由定義的實際值替換如下:

FullClassName類的全名,包括命名空間。

MethodName方法的名稱。

MethodParms參數類型/名稱對的列表。每一對都用逗號分隔( )(「,」)。如果方法名稱 取零參數,則省略此信息。

FileName聲明MethodName方法爲 的源文件的名稱。如果調試符號不是 可用,則此信息被省略。

LineNumber FileName中包含來自MethodName的源代碼的行中的行數,用於調用堆棧上的指令。 如果調試符號不可用,則省略此信息。

在這個問題你暗示Environment.StackTrace不回答你的問題,但它好像你應該能夠解析出源文件名和行號,然後再從文件中讀取該行。我錯過了什麼?

+0

這正是我到目前爲止所做的......將ASPX的源代碼(Request.PhysicalPath)讀入到一個字符串列表中,併爲該幀的「GetFileLineNumber() - 1」打印行。直接閱讀源代碼似乎有點奇怪,認爲可能有一種更優雅的方式來這樣做。 (我實際上使用'新的System.Diagnostics.StackTrace(true)'而不是'Environment.StackTrace',所以不需要解析字符串。) – richardtallent 2012-08-03 16:07:07

相關問題