【问题标题】:How to capture SQL statements of NHibernate with resharper and xunit 2如何使用 resharper 和 xunit 2 捕获 NHibernate 的 SQL 语句
【发布时间】:2017-01-24 16:21:30
【问题描述】:

我试图在单元测试会话的 Resharper 输出中显示我的 XUnit 2.x 单元测试中的 nhibernate sql 语句,但它确实记录了 sql 语句。

使用 MSpec 测试 没有问题,并且显示了 sql 语句。对于 XUnit 1.x,我认为 sql 语句也被记录了。

我已经通过属性show_sql配置了NHibernate

<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, 视觉工作室 2013

【问题讨论】:

标签: c# unit-testing nhibernate resharper xunit


【解决方案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())
        {

        }
    }
}

【讨论】:

  • 到哪里去工厂?
  • 还有 this.output?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
相关资源
最近更新 更多