惩戒System.Web.TraceContext与起订量

我有一些代码的访问HttpContextBase.Trace对象和做与它有些东西(检查IsEnabled ,写一些消息)。 的问题是,它是一个System.Web.TraceContext对象。 TraceContext是一个只有一个构造函数密封类:接受一个HttpContext对象。 最小起订量不能嘲笑或者TraceContextHttpContext 。 我可以做任何事情,这里测试此代码起订量?

或将我要出这个因素代码并停止指HttpContextBase.Trace

--------------解决方案-------------

我有点讨厌回答了说“不这样做”,因为有可能是答案的价值,不管使用哪种方法,但是,在这里我们去:

不要那样做。

让我们假设你有这个类:

public class MyCode
{
public void Do()
{
HttpContext.Current.Trace.WriteLine("WOO!");
}
}

这种事情是不是很测试。 如果你想重构可测性,你可以使用更多的是“控制反转”式的方法的。 在这里,我将使用“依赖注入”(也有其他选项,如“服务位置”和“抽象工厂”,但是这是最容易理解的):

public class MyCode
{
private IMyLogger _logger = null;
public MyCode(IMyLogger logger)
{
_logger = logger;
}

public void Do()
{
_logger.TraceWriteLine("WOO!");
}
}

现在,你可以看到这个代码非常检验的,你不必赴汤蹈火嘲笑什么。

//Confirms "Do" method calls "TraceWriteLine"
public void Do_Called_CallsTraceWriteLine()
{
//Arrange
var loggerMock = new Mock<IMyLogger>();
loggerMock.Setup(l => l.TraceWriteLine(It.IsAny<string.());

var target = new MyCode(loggerMock.Object);

//Act
target.Do();

//Assert
loggerMock.VerifyAll();
}

现在你IMyLogger的实现可能叫出HttpContext的,但它让你的目标类测试。

public DefaultLogger : IMyLogger
{
public void TraceWriteLine(string message)
{
HttpContext.Current.Trace.WriteLine(message);
}
}

为了实现这样的事情,很多人选择使用控制容器的反转。 你没有做到这一点,但它使事情变得简单,当您添加更多的依赖不会降低可维护性。 你可以想象,如果你曾经为.NET框架是不可测的各个部分的接口,你的“新mycode的”构造函数调用就开始变得很长。 IoC容器中,帮助你避免这种情况。

流行的IoC容器.NET:

  • Ninject
  • 统一
  • MEF(内置到.NET 4.0)
  • Autofac
  • 温莎城堡
  • StructureMap

您的帖子被标记的“ASP.NET”。 希望您在使用MVC。 如果是的话,它有依赖注入,这里的例子新的支持: http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx

希望这有助于。 对不起,它并不直接回答你的问题。

分类:C# 时间:2015-03-15 人气:0
本文关键词: .NET,asp.net,起订量
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.646 (s). 10 q(s)