2012-05-18 27 views
8

Khi viết kiểm tra đơn vị bằng cách sử dụng Moq bất cứ lúc nào tôi gọi số Elmah.ErrorSignal.FromCurrentContext không thành công với ngoại lệ tham chiếu null. Tôi có thể thử các ControllerContext và tôi muốn chỉ cần sử dụng một lệnh log lỗi như thế này ..Ghi nhật ký lỗi Elmah FromCurrentContext ngắt khi kiểm tra đơn vị

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

nhưng tiếc là ControllerContext.HttpContext là loại HttpContextBase và sẽ không làm việc với phương pháp khai thác gỗ lỗi này.

Có cách nào tốt hơn để gọi nhật ký lỗi Elmah trực tiếp không? Thật không may là đối tượng Application.HttpContext không thể được mô phỏng (dưới đây ví dụ) hoặc điều đó cũng sẽ phục vụ mục đích.

Mock 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); 

Lỗi Được sản xuất:

cài đặt không hợp lệ trên một tổ chức phi ảo (overridable trong VB) thành viên

+0

liên quan: [Làm thế nào tôi có thể giả lập thói quen ErrorSignal của Elmah?] (Http://stackoverflow.com/questions/1019833/how-can-i-mock-elmahs-errorsignal-routine) –

Trả lời

7

Một điều bạn có thể làm để ghi lại các lỗi khác nhau trong ELMAH là sử dụng:

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

Mặc dù điều này sẽ không đăng nhập một lỗi từ các bài kiểm tra đơn vị nó ít nhất sẽ bỏ qua việc đăng nhập hoàn toàn trong các bài kiểm tra đơn vị và vẫn đăng nhập lỗi trong hoàn cảnh bình thường.

13

Mặc dù bạn không thể giả HttpContext, bạn có thể thiết lập HttpContext.Current trong thử nghiệm của bạn.

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

Tôi không chắc chắn những phần nào của ngữ cảnh được Elmah sử dụng.

bên thứ 3 sửa:
ELMAH cũng đòi hỏi 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() 

nếu không nó ném một ngoại lệ vì tên ứng dụng là NULL.

Tiếp tục chỉnh sửa:
Đây là mã cuối cùng trong 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()}; 
Các vấn đề liên quan