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

NHibernate映射使用存储过程时如何进行单元测试,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我询问了在SQL Server中使用视图时如何注入存储过程支持 下面是一个映射文件: <sql-insert> exec sp_cycle_insert ?,?,? </sql-insert> <sql-update> exec sp_cycle_update ?,?,?,?,?,? </sql-update> <sql-delete> raiser

我询问了在SQL Server中使用视图时如何注入存储过程支持

下面是一个映射文件:

    <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>
我考虑了可能的解决方案,这里有:有没有办法:

运行其他脚本我想这是解决数据库所需的存储过程、视图等问题的方法 另一方面,如果我使用sdf文件,运行脚本可能会失败,但如果我将来更改为其他提供程序会怎么样?。此外,过程/视图还与构造一起使用,以及测试期间使用的数据库不支持的一些SQL Server 2005函数

. 因此,我认为是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性,NHibernate使用以下方式访问备份字段: access=nosetter.camelcase

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

运行其他脚本我想这是解决数据库所需的东西的解决方案,如红色过程、视图等

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

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

你可能应该两者都做。对真实数据库进行集成测试,以验证您的基础结构/DAL/无论您称之为什么层都可以工作。在更高层中,您可能希望编写单元测试,而不是模拟存储库之类的东西。 如果我正确理解您的问题,您在设置测试状态时会遇到问题,因为您的实体上的某些数据是私有的?这实际上不是NH/repos/data访问引起的问题,而是一个一般性问题。有不同的方法来解决这个问题,你可以;放松API使其更易于测试,让一个ctor接受所有数据,以一种或另一种方式使用反射,让实体的接口为只读,但其实现具有setter等。很难给出一般性建议,但要找到适合您的情况的方法

运行其他脚本我想这是解决数据库所需的东西的解决方案,如红色过程、视图等

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

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

你可能应该两者都做。对真实数据库进行集成测试,以验证您的基础结构/DAL/无论您称之为什么层都可以工作。在更高层中,您可能希望编写单元测试,而不是模拟存储库之类的东西。
如果我正确理解您的问题,您在设置测试状态时会遇到问题,因为您的实体上的某些数据是私有的?这实际上不是NH/repos/data访问引起的问题,而是一个一般性问题。有不同的方法来解决这个问题,你可以;放宽API以使其更易于测试,让一个ctor接受所有数据,以某种方式使用反射,让实体的接口为只读,但其实现具有setter等。很难给出一般性建议,但要找到适合您情况的方法。

在实体中拥有私有数据不是问题。问题是一些数据是在数据库级视图上计算的,因此为了正确创建测试中使用的对象,我必须在集成测试中复制视图的逻辑-验证视图逻辑对数据的处理是否正确。在您的单元测试中,模拟您的存储库。在实体中拥有私有数据不是问题。问题是一些数据是在数据库级视图上计算的,因此为了正确创建测试中使用的对象,我必须在集成测试中复制视图的逻辑-验证视图逻辑对数据的处理是否正确。在单元测试中,模拟存储库。
        new SchemaExport(configuration).Execute(false, true, false);