我问过在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函数。
存取= “nosetter.camelcase”
如果我切换到模拟存储库,我将负责在代码中实现视图的逻辑。还有其他解决方案吗?或者我遇到了大麻烦!?
答案 0 :(得分:1)
运行其他脚本(我猜这就是解决方案),包含数据库所需的东西(如存储过程,视图等)
为此使用IAuxiliaryDatabaseObject对象。它将包含在使用SchemaExport创建/删除模式时运行的额外脚本。这个/这些对象传递给NH Configuration对象(AddAuxiliaryDatabaseObject)。
所以我觉得是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性,NHibernate使用
访问支持字段
你应该两个都做。对您的真实数据库进行集成测试,以验证您的基础架构/ DAL /无论您调用它的层是如何工作的。在更高层中,您可能希望编写单元测试,而不是像存储库这样的东西被模拟。 如果我正确理解您的问题,您在设置测试状态时遇到问题,因为某些数据在您的实体上是私有的?这不是由NH / repos / data acess引起的“问题”,而是一个普遍问题。有不同的方法可以解决这个问题,你可以;放松你的API,使它更可测试,让ctor接受所有数据,使用反射方式,让你的实体的界面只读,但它的实现有setter等等。很难给出一般建议,但试图找到一个适合你的情况。