我正在使用NHibernate进行ORM,一切正常。
现在我开始编写一些单元测试(使用数据库,我不想过多地将它抽象出去,我知道它不完美,但它有效..)。
我需要确保DB对于某些测试是完全空的。当然,我可以创建整个数据库。但这似乎有点矫枉过正,我认为需要更长的时间......
是否有DELETE_ALL命令清除所有表,我可以在NHibernate中使用?
克里斯
编辑:一个简短的更新,我决定采用SQLite方式,用NHibernate改变这个没问题。有一些陷阱,我使用这个配置,它的工作原理。否则,由于nHibernate在会话期间关闭连接,可能会出现“未找到表”错误,从而导致“丢失”数据库......为了您的方便:复制并粘贴......
.Database(SQLiteConfiguration.Standard.ConnectionString("Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1;")
.Raw("connection.release_mode", "on_close"))
.Mappings(obj => obj.AutoMappings.Add(_config.APModel));
答案 0 :(得分:9)
删除并重新创建数据库。您可以使用schemaexport:
var export = new SchemaExport(config);
export.Drop(false, true);
export.Create(true, true);
内存中的Sql lite对于测试比“普通”数据库运行得更快,但缺点是sql-lite方言可能与生产中的sql方言不同。
答案 1 :(得分:2)
我建议你查看ndbunit。它不是特定于NHibernate的,但我过去用它来测试NHibernate项目并且效果很好。基本上,它提供了清除数据库,预填充测试数据或在每次测试后将其恢复到已知状态的功能。您只需提供数据库模式的XSD,以及可选的一些XML数据以进行预填充。
我相信我是第一次在Summer of NHibernate屏幕播放系列节目中看到过这一点,所以请查看这些内容,看看它是否正在使用中。
答案 2 :(得分:1)
你没有编写单元测试(即测试一个单元的测试),你正在编写单元交互的集成测试(即与你的数据库交互)。
部分测试基础架构可以运行执行以下操作之一的sql脚本:
理想情况下,你确实需要做一些工作来抽象数据库,特别是因为你有NH使得它比其他框架更容易。
答案 3 :(得分:0)
使用像SQLite这样的内存数据库,并在每次测试之前在其中设置必要的数据。初始设置需要一些时间,但之后每个测试运行得非常快,您可以确保从一个干净的平板开始。 Ayende有一些关于如何设置它的博客文章。
答案 4 :(得分:0)
万一Drop / Create DB不适合您的需求(如果db包含NHibernate不知道的对象,如SP,函数等),您可以随时将DB备份为空并且在您之后'完成测试只是恢复到那一点