MVC 网络解决方案上的 Log4Net
Log4Net on a MVC web solution
我正在创建一个包含两个项目的解决方案:Web 项目和它的测试项目。我正在使用 Log4net 进行日志记录,CastleWindsor 用于 dependency injection 和 moq 用于测试。
我遇到的问题是测试的配置。我想测试正在记录到文件的 HomeController,但是当我 运行 我不想记录的测试时,我认为这是荒谬的。
有没有办法在测试项目中跳过Logging?
HomeControllerclass:
public class HomeController : Controller
{
// this is Castle.Core.Logging.ILogger, not log4net.Core.ILogger
public ILogger Logger { get; set; }
private IRowan _rowan;
public HomeController(IRowan rowan)
{
_rowan = rowan;
}
public ActionResult Index()
{
//In the [tests] Logger fails
Logger.Debug("GET Request traced");
Logger.Error("Example of Error");
String test = _rowan.DoSomething();
ViewBag.Title = test;
return View();
}
}
}
正在测试:
[TestClass]
public class HomeControllerTest
{
private static WindsorContainer _container;
[ClassInitialize()]
public static void InstallWindsor()
{
_container = new WindsorContainer();
// configure other classes
}
[ClassCleanup()]
public static void DisposeContainer()
{
_container.Dispose();
}
[TestMethod]
public void Index()
{
// Disponer
var mock = new Mock<IRowan>();
mock.Setup(m => m.DoSomething()).Returns("Home Page");
HomeController controller = new HomeController(mock.Object);
// Actuar
ViewResult result = controller.Index() as ViewResult;
// Declarar
Assert.IsNotNull(result);
Assert.AreEqual("Home Page", result.ViewBag.Title);
}
}
如果答案是否定的,哪种是实现 log4net 进行测试的最佳方式?
PD:当我 运行 代码时,它工作正常。当我运行测试时,Logger抛出异常,因为是null。
PD:我开始使用 Microsoft 技术。
您可以像这样模拟您的记录器并将其设置在您的控制器上:
Mock<ILogger> mockLogger = new Mock<ILogger>();
controller.Logger = mockLogger.Object;
请注意,您实际上不需要在测试中使用 CastleWindsor。这对于控制应用程序中对象的生命周期很有用,但在您的测试中,您应该手动注入东西。您实际上在上面的示例中这样做了。从您发布的代码中,您可以删除 ClassInitialize 和 ClassCleanup 函数,它将 运行 相同。
您可以为您的测试项目使用其他配置。
阅读更多:https://logging.apache.org/log4net/release/manual/configuration.html
我正在创建一个包含两个项目的解决方案:Web 项目和它的测试项目。我正在使用 Log4net 进行日志记录,CastleWindsor 用于 dependency injection 和 moq 用于测试。
我遇到的问题是测试的配置。我想测试正在记录到文件的 HomeController,但是当我 运行 我不想记录的测试时,我认为这是荒谬的。
有没有办法在测试项目中跳过Logging?
HomeControllerclass:
public class HomeController : Controller
{
// this is Castle.Core.Logging.ILogger, not log4net.Core.ILogger
public ILogger Logger { get; set; }
private IRowan _rowan;
public HomeController(IRowan rowan)
{
_rowan = rowan;
}
public ActionResult Index()
{
//In the [tests] Logger fails
Logger.Debug("GET Request traced");
Logger.Error("Example of Error");
String test = _rowan.DoSomething();
ViewBag.Title = test;
return View();
}
}
}
正在测试:
[TestClass]
public class HomeControllerTest
{
private static WindsorContainer _container;
[ClassInitialize()]
public static void InstallWindsor()
{
_container = new WindsorContainer();
// configure other classes
}
[ClassCleanup()]
public static void DisposeContainer()
{
_container.Dispose();
}
[TestMethod]
public void Index()
{
// Disponer
var mock = new Mock<IRowan>();
mock.Setup(m => m.DoSomething()).Returns("Home Page");
HomeController controller = new HomeController(mock.Object);
// Actuar
ViewResult result = controller.Index() as ViewResult;
// Declarar
Assert.IsNotNull(result);
Assert.AreEqual("Home Page", result.ViewBag.Title);
}
}
如果答案是否定的,哪种是实现 log4net 进行测试的最佳方式?
PD:当我 运行 代码时,它工作正常。当我运行测试时,Logger抛出异常,因为是null。
PD:我开始使用 Microsoft 技术。
您可以像这样模拟您的记录器并将其设置在您的控制器上:
Mock<ILogger> mockLogger = new Mock<ILogger>();
controller.Logger = mockLogger.Object;
请注意,您实际上不需要在测试中使用 CastleWindsor。这对于控制应用程序中对象的生命周期很有用,但在您的测试中,您应该手动注入东西。您实际上在上面的示例中这样做了。从您发布的代码中,您可以删除 ClassInitialize 和 ClassCleanup 函数,它将 运行 相同。
您可以为您的测试项目使用其他配置。 阅读更多:https://logging.apache.org/log4net/release/manual/configuration.html