2012-05-18 6 views
8

いつでもMoqを使用してユニットテストを作成しましたが、Elmah.ErrorSignal.FromCurrentContextと呼びます。ヌル参照例外が発生して失敗します。私はControllerContextを模擬することができていると私はちょうどこのようなエラーログコマンドを使用したいと思います..ユニットテスト時のFromCurrentContextのロギングエラーが発生しました。

Elmah.ErrorSignal.FromContext(ControllerContext.HttpContext).Raise(e); 

残念ながらControllerContext.HttpContextはタイプHttpContextBaseのものであり、このエラーロギング方式では動作しません。

Elmahエラーログを直接呼び出すより良い方法はありますか?残念ながら、Application.HttpContextオブジェクトは(下記の例のように)嘲笑されたり、目的を果たしたりすることはできません。

モックApplicationApplication.HttpContext

ctrlCtx.SetupGet(x => x.HttpContext.ApplicationInstance) 
      .Returns(new Mock<HttpApplication>().Object); 
ctrlCtx.SetupGet(x => x.HttpContext.ApplicationInstance.Context) 
      .Returns(new Mock<HttpContext>().Object); 

生成されたエラー:非仮想(VBでオーバーライド)メンバー

+0

関連[ElmahのErrorSignalルーチンをどうやって模擬できますか?](http://stackoverflow.com/questions/1019833/how-can-i-mock-elmahs-errorsign-routine) –

答えて

7

ことの一つは、使用することです:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e)); 

が、これは単体テストのエラーをログに記録しません。単体テストで少なくともロギングをスキップし、通常の状況でもエラーを記録します。

13

無効なセットアップあなたがのHttpContextを模擬することはできませんけれども、することができますテストでHttpContext.Currentを設定します。

var req = new HttpRequest(string.Empty, "https://www.domain.tld", null); 
var res = new HttpResponse(null); 
HttpContext.Current = new HttpContext(req, res); 

私は、Elmahがどのようなコンテキストを使用しているのかよく分かりません。

サードパーティの編集:
ELMAHは、アプリケーション名がNULLであるため、それ以外の場合は例外をスローSystem.Web.HttpContext.Current.ApplicationInstance

Dim req As System.Web.HttpRequest = New System.Web.HttpRequest(String.Empty, "https://www.domain.tld", Nothing) 
Dim res As System.Web.HttpResponse = New System.Web.HttpResponse(Nothing) 
System.Web.HttpContext.Current = New System.Web.HttpContext(req, res) 

System.Web.HttpContext.Current.ApplicationInstance = New System.Web.HttpApplication() 

が必要です。

さらに編集:ここでは
は、C#での最終的なコードです:あなたはELMAHで異なるエラーを記録するために行うことができます

var req = new HttpRequest(string.Empty, "https://www.domain.tld", null); 
var res = new HttpResponse(null); 
HttpContext.Current = new HttpContext(req, res) 
    {ApplicationInstance = new HttpApplication()}; 
関連する問題