如何在NHibernate Mapping使用存储过程时进行单元测试

时间:2012-08-28 15:55:49

标签: nhibernate nhibernate-mapping

我问过在SQL Server中使用Views时如何注入存储过程支持。

How to use stored procedures in NHibernate for Create/Update when working with database view

这是一段映射文件:

    <sql-insert>
        exec sp_cycle_insert ?,?,?
    </sql-insert>
    <sql-update>
        exec sp_cycle_update ?,?,?,?,?,?
    </sql-update>
    <sql-delete>
        raiserror ('Cycle can not be deleted', 10, 1)
    </sql-delete>

所以,我已经完成了重构等工作,并且我运行了测试....所有都失败了。

原因是SQL Server有视图&amp;存储过程,而每次我运行测试时,我都会从头开始设置数据库:

        new SchemaExport(configuration).Execute(false, true, false);

我想到了可能的解决方案,这里有:有办法:

  • 运行其他脚本(我猜这就是解决方案),包含数据库所需的东西(如存储过程,视图等)

另一方面,运行脚本可能会失败(目前我使用的是sdf文件,但如果将来我更改为其他提供程序会怎么样?)。程序/视图也使用 WITH 构造以及测试期间使用的数据库不支持的一些 SQL Server 2005函数

  • 。所以我觉得是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性,NHibernate使用以下方式访问支持字段:
  

存取= “nosetter.camelcase”

如果我切换到模拟存储库,我将负责在代码中实现视图的逻辑。还有其他解决方案吗?或者我遇到了大麻烦!?

1 个答案:

答案 0 :(得分:1)

  

运行其他脚本(我猜这就是解决方案),包含数据库所需的东西(如存储过程,视图等)

为此使用IAuxiliaryDatabaseObject对象。它将包含在使用SchemaExport创建/删除模式时运行的额外脚本。这个/这些对象传递给NH Configuration对象(AddAuxiliaryDatabaseObject)。

  

所以我觉得是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性,NHibernate使用

访问支持字段

你应该两个都做。对您的真实数据库进行集成测试,以验证您的基础架构/ DAL /无论您调用它的层是如何工作的。在更高层中,您可能希望编写单元测试,而不是像存储库这样的东西被模拟。 如果我正确理解您的问题,您在设置测试状态时遇到问题,因为某些数据在您的实体上是私有的?这不是由NH / repos / data acess引起的“问题”,而是一个普遍问题。有不同的方法可以解决这个问题,你可以;放松你的API,使它更可测试,让ctor接受所有数据,使用反射方式,让你的实体的界面只读,但它的实现有setter等等。很难给出一般建议,但试图找到一个适合你的情况。