0

レガシーコードにいくつかの単体テストを追加しようとしています。関数の多くは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()

これはすぐに機能しますが、「オブジェクトのインスタンスにオブジェクト参照が設定されていません」というエラーが表示されます。Trace.Write()

単体テストを実行していてトレースを呼び出さないかどうかをテストする方法はありますか? 例外をスローしないように html オブジェクトをモックできますか? 例外を超えてプッシュできますか? Trace を削除する必要がありますか? 私はかなり厳密にマイクロソフトの派生製品ショップにいるので、テストを MsTest 内に保持したいと思います。

アップデート

からのスタックトレースは次のとおりです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呼び出された Page の を返します。本質的に、それは書くことと同じですPage.Trace.Write

問題は、 @ Ross Presserの Unit Test Setup への追加の提案を使用HttpContext.Currentする場合でも、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 を使用することはできますが、これは前と同じ問題に遭遇します。また、Traceプロパティ onPageにはセッターがないため、自然に継承せずにページにコンテキストを与えることは難しいようです。

4

1 に答える 1

1

テスト環境とライブ環境を区別する手っ取り早い方法:

If HttpContext.Current Is Nothing Then

Trace.Write ステートメントが NullReferenceException をスローしている理由は、Trace が 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
于 2013-06-05T14:35:53.903 に答える