9

いつでも Moq を使用して単体テストを作成するElmah.ErrorSignal.FromCurrentContextと、null 参照例外で失敗します。をモックすることができ、ControllerContextこのようなエラーログコマンドを使用したいと思います..

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 でオーバーライド可能) メンバーでの無効なセットアップ

4

2 に答える 2

14

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 には 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()

それ以外の場合、アプリケーション名が NULL であるため、例外がスローされます。

さらに編集:
C# の最終的なコードは次のとおりです。

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()};
于 2012-05-18T21:05:15.487 に答える
7

Elmahでエラーを別の方法でログに記録するためにできることの1つは、次を使用することです。

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

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

于 2012-05-21T13:30:31.003 に答える