MVC 网络解决方案上的 Log4Net

Log4Net on a MVC web solution

我正在创建一个包含两个项目的解决方案:Web 项目和它的测试项目。我正在使用 Log4net 进行日志记录,CastleWindsor 用于 dependency injectionmoq 用于测试。

我遇到的问题是测试的配置。我想测试正在记录到文件的 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