.net - 如何在 xunit2 中捕获 log4net 输出

标签 .net unit-testing log4net xunit2

我已阅读 http://xunit.github.io/docs/capturing-output.html它似乎适用于在测试运行期间使我的测试输出特定消息,但我真的希望能够捕获已经集成到我正在测试的类中的 log4net 输出。

过去,我设置了 log4net 来使用 TraceLogger,并且测试框架能够将输出与测试关联起来。 (不同的测试框架)。如何以某种方式将 log4net 输出关联到 Xunit IOutputHelper?

最佳答案

这就是我想出的答案

这是一个我可以让我的测试类继承的类:

   public class LogOutputTester:IDisposable
    {
        private readonly IAppenderAttachable _attachable;
        private TestOutputAppender _appender;

        protected LogOutputTester(ITestOutputHelper output)
        {
            log4net.Config.XmlConfigurator.Configure(); 
            var root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
            _attachable = root;

            _appender = new TestOutputAppender(output);
            if (_attachable != null)
                _attachable.AddAppender(_appender);
        }

        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            _attachable.RemoveAppender(_appender);
        }
    }

这是我在上面的帮助器中引用的自定义 Appender:

 public class TestOutputAppender : AppenderSkeleton
    {
        private readonly ITestOutputHelper _xunitTestOutputHelper;

        public TestOutputAppender(ITestOutputHelper xunitTestOutputHelper)
        {
            _xunitTestOutputHelper = xunitTestOutputHelper;
            Name = "TestOutputAppender";
            Layout = new PatternLayout("%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n");
        }

        protected override void Append(LoggingEvent loggingEvent)
        {
            _xunitTestOutputHelper.WriteLine(RenderLoggingEvent(loggingEvent));
        }
    }

这可以进行更多自定义以采用自定义布局或其他...

最后 - 我只是让我的测试类继承这个助手:

   public class MyTestClass:LogOutputTester
    {
        public EdgeClientTests(ITestOutputHelper output):base(output)
        {
        }
    ...

您也可以让您的测试直接访问输出对象...

关于.net - 如何在 xunit2 中捕获 log4net 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680471/

相关文章:

c# - OutOfMemoryException加载xml文档winmo 6.1

java - 如何使用Mockito测试Android MainActivity onCreate中的依赖

c# - log4net AdoNetAppender 在数据库中插入 "Null"字符串而不是空值

c# - log4net:使用 ILog 与 ILogger 之间的区别/优势是什么?

c# - try catch 的行为,最后在 c# 中使用 return 语句工作流程

c# - NAudio 未播放,但正在调用 WaveProvider32 Read

.net - 有没有办法通过Graph API来统计合法持有的数据?

matlab - 在不调用 `clear all` 的情况下破坏 Matlab Singleton 类实例

unit-testing - 像 isInUnitTest() 这样的检查是反模式吗?

c# - 让 log4net 使用应用程序配置文件来获取配置数据