我试图在单元测试会话的Resharper输出中从我的XUnit 2.x单元测试中显示nhibernate的sql语句,但它确实记录了sql语句。
使用 MSpec测试时没有问题,并显示sql语句。使用 XUnit 1.x ,我认为还记录了sql语句。
我已经通过属性show_sql
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
XUnit 2中有a change如何捕获输出,但我不知道如何将它与NHibernate结合起来记录sql语句。
有没有人为此解决问题?我试图避免在我的单元测试中使用log4net集成来记录这些语句。
XUnit 2.1, NHibernate 4.0, ReSharper 2016.3.1, Visual Studio 2013
答案 0 :(得分:1)
感谢@David Osborne的评论,我使用EmptyInterceptor
来捕获NHibernate的SQL语句,并将它们写入XUnit框架提供的ITestOutputHelper
。
public class XUnitSqlCaptureInterceptor : EmptyInterceptor
{
public XUnitSqlCaptureInterceptor(ITestOutputHelper output)
{
this.Output = output;
}
public ITestOutputHelper Output { get; set; }
public override SqlString OnPrepareStatement(SqlString sql)
{
this.Output.WriteLine(sql.ToString());
return sql;
}
}
用法如下:
[Fact]
public void MyUnitTestWithSQL()
{
using (var session = factory.OpenSession(new XUnitSqlCaptureInterceptor(this.output)))
{
using (var transcation = session.BeginTransaction())
{
}
}
}