2013-06-05 32 views
0

我試圖向一些遺留代碼添加一些單元測試。許多功能與Trace.Write使用MSTest在ASP.NET中使用Trace.Write()進行單元測試方法

Function FormatDate(ByVal inputAsString As String) As String 
    Trace.Write("Function FormatDate") 

開始當我運行對全套ASP.NET單元測試的屬性測試,時間過久:

<TestMethod(), _ 
HostType("ASP.NET"), _ 
UrlToTest("http://localhost:25153/WebSite1"), _ 
AspNetDevelopmentServerHost("C:\WebSite1", "/WebSite1")> 
Public Sub FormatDateTest() 

對此,我剛測試的類本身的實例:

<TestMethod(), _ 
Public Sub FormatDateTest() 

這也很快。但我得到一個「對象引用不設置到對象的實例」錯誤,當我在到達

是否有某種方式可以測試我是否運行單元測試而不調用跟蹤?我可以嘲笑一個html對象,以便它不會引發任何問題嗎?我可以推動超出例外嗎?我應該擺脫跟蹤?我喜歡在MsTest中保留測試,因爲我在一個相當嚴格的Microsoft衍生產品商店。

更新

下面是來自NullReferenceException

at System.Web.UI.UserControl.get_Trace() 
at Applications.Interface.UCparent.FormatDate(String inputAsString, Boolean isFuzzy, Char& precision) 
in \\...\UCparent.ascx.vb:line 285 

Trace.Write方法返回頁面上調用它的System.Web.TraceContext堆棧跟蹤。本質上,它是idential編寫Page.Trace.Write

的問題是,使用@添加HttpContext.Current到單元測試設置的Ross Presser的建議時,它仍會出現下列情況Page.Trace Is Nothing = True

'This Works 
HttpContext.Current.Trace.Write("HttpContext.Current") 
'This Doesn't 
Page.Trace.Write("Page.TraceContext") 
'This Doesn't 
Trace.Write("Page.TraceContext") 

我可以進去更改所有的Trace.Write方法以使用HttpContext而不是默認的頁面上下文,但運行時會遇到與前面相同的問題。 Page上的Trace屬性也沒有setter,所以看起來很難只給頁面一些上下文而沒有自然地繼承它。

回答

1

一個快速和骯髒的方式測試環境和生活環境之間的區別:

If HttpContext.Current Is Nothing Then 

這可能是因爲您的Trace.Write語句拋出NullReferenceException異常的原因是因爲跟蹤是依靠有作爲一個HttpContext。如果是這樣,你可以嘲笑HttpContext:

<TestInitialize()> 
Public Sub Setup() 
    'Since this is not a real web app, we need to mock at least 
    'the current HttpContext 
    HttpContext.Current = New HttpContext(_ 
     New HttpRequest("", "http://tempuri.org", ""), _ 
     New HttpResponse(New StringWriter()) _ 
    ) 
End Sub 
+0

謝謝!檢查'HttpContext.Current'是否有效,但我當然必須更改調用'Trace.Write'的每行代碼。我更喜歡你的第二種選擇,但即使在我的TestSetup方法中提供了HttpContext之後,我仍然得到一個'NullReferenceException'。 – KyleMit

+0

你能提供'NullReferenceException'的完整堆棧跟蹤嗎? –

相關問題