RSS  

Thomas G. Mayfield

Category: NHibernate

Failing unit test for NHibernate configuration warnings/errors

2008-07-11 @ 1:34:59 UTC
Filed under: NHibernate by thomas

I’d mentioned on Dave Laribee’s Test Your NHibernate Mappings! post that you can use a custom log4net appender to catch the messages NHibernate outputs on initialization. Here’s a bit more detail.

First, the custom ListAppender class:

class ListAppender
    : log4net.Appender.AppenderSkeleton
{
    private List<LoggingEvent> _events = new List<LoggingEvent>();
    public List<LoggingEvent> Events
    {
        get { return _events; }
    }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        _events.Add(loggingEvent);
    }
}

And a sample unit test:

[Test]
public void TreatNHibernateWarningsAsFailures()
{
    ListAppender appender = new ListAppender()
    {
        Threshold = log4net.Core.Level.Warn,
    };
    log4net.Config.BasicConfigurator.Configure(appender);

    string myConfigPath = @"wherever\you\put\your\NHibernate\config.xml";
    Configuration config = new Configuration().Configure(myConfigPath);

    using (ISessionFactory factory = config.BuildSessionFactory())
    {
        // Spin up the factory and then throw it away. We just want to guarantee that initialization has occurred.
    }

    if (appender.Events.Count == 0)
    {
        return;
    }

    StringBuilder errors = new StringBuilder();
    errors.Append("Warnings/errors issued when starting up NHibernate:");

    foreach (log4net.Core.LoggingEvent ev in appender.Events)
    {
        errors
            .AppendLine()
            .AppendFormat("\t{0}: {1} - {2}", ev.Level, ev.LoggerName, ev.RenderedMessage);
    }

    Assert.Fail(errors.ToString());
}

Powered by WordPress