тестирование сопоставления сущностей NHibernate - PullRequest
0 голосов
/ 26 мая 2009

Я строю некоторые простые грубые методы для моих свободно отображаемых сущностей.

Я просто хочу знать, есть ли простой способ сделать транзакцию для выполнения отката, когда я запускаю методы cud test?

код, который тестируется, выполняет коммит внутри

вот пример создания:

 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;
    }

Ответы [ 4 ]

2 голосов
/ 15 июня 2009

Если вы используете xUnit.net, в проекте contrib есть атрибут AutoRollback. Если вы открыты для использования 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.

1 голос
/ 26 мая 2009

Проверьте FUBUMVC Contrib для отличного метода тестирования CRD NHibernate.

0 голосов
/ 07 ноября 2009

Для интеграционного тестирования я использую декоратор сеанса для автоматической фиксации и удаления объекта. Вы можете адаптировать его для вашей ситуации:

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);
    }
}

Более подробную информацию об использовании можно найти здесь: http://www.agileatwork.com/integration-testing-with-nhibernate/

0 голосов
/ 26 мая 2009

Хм, я не думаю, что это хорошая идея - позволить вашему методу создавать сеанс и выполнять обработку транзакций .... Если этот метод не является также границей обслуживания.

Предположим, вы хотите создать несколько сущностей в одной и той же транзакции, как вы собираетесь это обрабатывать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...