What I want to test :
[Test]
public void MapperShouldNotCauseExtraQueries()
{
using(0.Queries())
{
Mapper.Map(entityResultFromQuery);
}
}
The plumbing :
public class QuerySpy : IDisposable
{
private readonly int expectedNumber;
private readonly NHibernateSqlLogSpy spy;
public QuerySpy(int expectedNumber)
{
this.expectedNumber = expectedNumber;
spy = new NHibernateSqlLogSpy();
}
public void Dispose()
{
Assert.AreEqual(expectedNumber, spy.Appender.GetEvents().Count());
}
}
public static class NumberOfQueriesUsedExtension
{
public static QuerySpy Queries(this int expectedNumber)
{
return new QuerySpy(expectedNumber);
}
}
public class NHibernateSqlLogSpy : LogSpy
{
public NHibernateSqlLogSpy() : base("NHibernate.SQL") { }
}
public class LogSpy : IDisposable
{
static LogSpy()
{
XmlConfigurator.Configure();
}
private readonly MemoryAppender appender;
private readonly Logger logger;
private readonly Level prevLogLevel;
public LogSpy(string loggerName)
{
logger = LogManager.GetLogger(loggerName) as Logger;
if (logger == null)
throw new NullReferenceException();
prevLogLevel = logger.Level;
logger.Level = Level.Debug;
appender = new MemoryAppender();
logger.AddAppender(appender);
}
public MemoryAppender Appender { get { return appender; } }
public virtual void Dispose()
{
logger.Level = prevLogLevel;
logger.RemoveAppender(appender);
}
}