Unit testing NHibernate的测试实体映射
我正在为我流畅映射的实体构建一些基本的crud方法 我只是想知道,当我运行cud测试方法时,是否有一种简单的方法使事务执行回滚 正在测试的代码在内部执行提交 下面是一个创建示例:Unit testing NHibernate的测试实体映射,unit-testing,nhibernate,Unit Testing,Nhibernate,我正在为我流畅映射的实体构建一些基本的crud方法 我只是想知道,当我运行cud测试方法时,是否有一种简单的方法使事务执行回滚 正在测试的代码在内部执行提交 下面是一个创建示例: public int? Create(IIdentifiable entity) { int? newId = null; using (ISession session = SessionFactoryProvider.NewSession) using (I
public int? Create(IIdentifiable entity)
{
int? newId = null;
using (ISession session = SessionFactoryProvider.NewSession)
using (ITransaction transaction = session.BeginTransaction())
{
object newObj = session.Save(entity);
newId = (int?)newObj;
transaction.Commit();
}
return (int?)newId;
}
嗯,我认为让您的方法创建会话并执行事务处理不是一个好主意。。。。除非该方法也是服务边界
假设您想在同一事务中创建多个实体,您将如何处理它?嗯,我认为让您的方法创建会话并执行事务处理不是一个好主意。。。。除非该方法也是服务边界
假设您想在同一事务中创建多个实体,您将如何处理它?检查一个好的NHibernate CRUD测试方法。检查一个好的NHibernate CRUD测试方法。如果您使用的是xUnit.net,contrib项目中有一个自动回滚属性。如果您愿意使用System.Transactions,则可以在会话之前创建一个新事务。open()和会话应自动登记(除非您已将ado.net设置为不自动登记)。然后在最后放弃 不久前,我做了类似的事情:
public class TransactionalTest
{
public TransactionalTest()
{
Transaction.Current = new CommittableTransaction();
}
~TransactionalTest()
{
if (Transaction.Current != null &&
Transaction.Current.TransactionInformation.Status !=
TransactionStatus.Committed)
{
Transaction.Current.Rollback();
}
}
}
然后让您的测试扩展TransactionalTest。但是,我认为NUnit、MbUnit和xUnit.net都支持开箱即用的事务测试,或者支持contrib项目。如果您使用的是xUnit.net,contrib项目中有一个自动回滚属性。如果您愿意使用System.Transactions,则可以在会话之前创建一个新事务。open()和会话应自动登记(除非您已将ado.net设置为不自动登记)。然后在最后放弃 不久前,我做了类似的事情:
public class TransactionalTest
{
public TransactionalTest()
{
Transaction.Current = new CommittableTransaction();
}
~TransactionalTest()
{
if (Transaction.Current != null &&
Transaction.Current.TransactionInformation.Status !=
TransactionStatus.Committed)
{
Transaction.Current.Rollback();
}
}
}
然后让您的测试扩展TransactionalTest。但是,我认为NUnit、MbUnit和xUnit.net都支持开箱即用的事务测试,或者支持contrib项目。对于集成测试,我使用会话装饰器自动提交和退出实体。您可以根据自己的情况进行调整:
public class AutoCommitAndEvictSession : SessionDecorator {
public AutoCommitAndEvictSession(ISession session)
: base(session) { }
public override object Save(object obj) {
object result;
using (var tx = Session.BeginTransaction()) {
result = Session.Save(obj);
tx.Commit();
}
Session.Evict(obj);
return result;
}
public override void Update(object obj) {
CommitAndEvict(base.Update, obj);
}
public override void Delete(object obj) {
CommitAndEvict(base.Delete, obj);
}
private void CommitAndEvict(Action<object> action, object entity) {
using (var tx = Session.BeginTransaction()) {
action.Invoke(entity);
tx.Commit();
}
Session.Evict(entity);
}
}
公共类自动提交会话:SessionDecorator{
公共自动提交会话(ISession会话)
:base(session){}
公共覆盖对象保存(对象对象){
客观结果;
使用(var tx=Session.BeginTransaction()){
结果=Session.Save(obj);
tx.Commit();
}
会议.驱逐(obj);
返回结果;
}
公共覆盖无效更新(对象obj){
提交和收回(base.Update,obj);
}
公共覆盖无效删除(对象obj){
committendexecute(base.Delete,obj);
}
私有void commitandexecute(操作、对象实体){
使用(var tx=Session.BeginTransaction()){
调用(实体);
tx.Commit();
}
会议.驱逐(实体);
}
}
您可以在以下示例中找到有关用法的更多详细信息:
对于集成测试,我使用会话装饰器自动提交和退出实体。您可以根据自己的情况进行调整:
public class AutoCommitAndEvictSession : SessionDecorator {
public AutoCommitAndEvictSession(ISession session)
: base(session) { }
public override object Save(object obj) {
object result;
using (var tx = Session.BeginTransaction()) {
result = Session.Save(obj);
tx.Commit();
}
Session.Evict(obj);
return result;
}
public override void Update(object obj) {
CommitAndEvict(base.Update, obj);
}
public override void Delete(object obj) {
CommitAndEvict(base.Delete, obj);
}
private void CommitAndEvict(Action<object> action, object entity) {
using (var tx = Session.BeginTransaction()) {
action.Invoke(entity);
tx.Commit();
}
Session.Evict(entity);
}
}
公共类自动提交会话:SessionDecorator{
公共自动提交会话(ISession会话)
:base(session){}
公共覆盖对象保存(对象对象){
客观结果;
使用(var tx=Session.BeginTransaction()){
结果=Session.Save(obj);
tx.Commit();
}
会议.驱逐(obj);
返回结果;
}
公共覆盖无效更新(对象obj){
提交和收回(base.Update,obj);
}
公共覆盖无效删除(对象obj){
committendexecute(base.Delete,obj);
}
私有void commitandexecute(操作、对象实体){
使用(var tx=Session.BeginTransaction()){
调用(实体);
tx.Commit();
}
会议.驱逐(实体);
}
}
您可以在以下示例中找到有关用法的更多详细信息:
这是服务边界,没有多个实体创建这是服务边界,没有多个实体创建