Как я могу заставить транзакцию Nhibernate потерпеть неудачу? - PullRequest
1 голос
/ 30 ноября 2009

Как я могу принудительно завершить транзакцию Nhibernate (из вызывающего кода), чтобы я мог убедиться, что поведение сбоя работает правильно?

Я не могу изменить исходный код, мне просто нужно, чтобы он вышел из строя!

пример:

public void DoSomething(/*Some parameters*/){
using (var tx = _session.BeginTransaction())
{
    try
    {
        //Do something
        tx.Commit();
    }
    catch (Exception)
    {
        if (tx != null) tx.Rollback();
            throw;
    }
} }

Ответы [ 7 ]

3 голосов
/ 30 ноября 2009

Брось исключение.

2 голосов
/ 30 ноября 2009

Брось исключение:

using(var sess = sf.OpenSession())
    using(var tx = sess.BeginTransaction())
        throw new Exception();

Закрыть соединение:

using(var sess = sf.OpenSession())
    using(var tx = sess.BeginTransaction())
        sess.Connection.Close();

Откат транзакции:

using(var sess = sf.OpenSession())
    using(var tx = sess.BeginTransaction())
        tx.Rollback();
1 голос
/ 30 ноября 2009

Если вам нужно, чтобы исключение возникало в tx.Commit (), то, возможно, вставьте / обновите запись с недопустимыми данными (например, слишком длинной для столбца db).

0 голосов
/ 01 декабря 2009

Один из способов сделать это:

[Test]
public void VerifyExceptionIsThrown()
{
    Assert.Throws<NHibernate.HibernateException>(
       () =>
       {
             using (var tx = _session.BeginTransaction())
             {
                 _session.Update(new Entity());
                 tx.Commit();
             }
       });
}

Попытка обновить временную сущность приведет к исключению.

В качестве альтернативы, если вы используете NHibernateValidator, вы можете явно не выполнить установленную вами проверку, скажем, свойство Name вашей сущности должно иметь длину не более 10 символов. Если вы заполняете свойство Name вашей сущности строкой длиной более 10 символов и пытаетесь сохранить ее, tx.Commit () выдаст вам исключение.

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

Вы можете написать модульный тест для проверки ожидаемого поведения вашего кода.

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

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

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

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

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