NHibernate Load против Get поведения для тестирования - PullRequest
2 голосов
/ 30 августа 2011

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

Так что мне нужно перейти к БД, и я хотел бы, чтобы вспомогательное утверждение сделало тесты более читабельными, и именно здесь возникает вопрос. Мне нравится идея использовать Load для сохранения вызова БД, но я Мне интересно, могут ли следующие исключения повредить сеанс.

Ниже показано, как будут выглядеть два утверждения. Что бы вы использовали?

Приветствия
Berryl

Получить

public static void AssertIsTransient<T>(this T instance, ISession session)
    where T : Entity
{
    if (instance.IsTransient()) return; 

    var found = session.Get<T>(instance.Id);
    if (found != null) Assert.Fail(string.Format("{0} has persistent id '{1}'", instance, instance.Id));
}

Load

public static void AssertIsTransient<T>(this T instance, ISession session)
    where T : Entity
{
    if (instance.IsTransient()) return; 

    try
    {
        var found = session.Load<T>(instance.Id);
        if (found != null) Assert.Fail(string.Format("{0} has persistent id '{1}'", instance, instance.Id));
    }
    catch (GenericADOException)
    {
        // nothing
    }
    catch (ObjectNotFoundException)
    {
        // nothing
    }
}

редактировать

В любом случае я буду делать выборку (Get или Load) в новом сеансе, свободном от состояния из сеанса, который выполнял сохранение или удаление.

Я пытаюсь протестировать каскадное поведение, а НЕ проверять способность NHib удалять вещи, но, возможно, я слишком много думаю об этом или есть более простой способ, о котором я не задумывался.

1 Ответ

6 голосов
/ 30 августа 2011

Ваш код в разделе 'Load' всегда будет попадать в Assert.Fail, но никогда не генерирует исключение, так как Load<T> вернет прокси (с установленным свойством Id - или заполненный из кэша 1-го уровня) без нажатияБД - т.е.ISession.Load потерпит неудачу, только если вы получите доступ к свойству, отличному от вашего Id-свойства, в удаленной сущности.

Что касается вашего раздела «Get» - я могу ошибаться, но я думаю, что если вы удалите сущность в сеансе - а позже попытаетесь использовать .Get в том же сеансе - вы получите тотв кеше 1-го уровня - и снова не вернуть ноль.

См. сообщение для полного объяснения .Load и .Get.

Если вам действительно нужно увидеть, еслион находится в вашей БД - используйте IStatelessSession - или запустите дочернюю ISession (у которой будет пустой кэш 1-го уровня.

РЕДАКТИРОВАТЬ: я подумал о более серьезной проблеме - ваша сущность будет сначала удалена, когда транзакцияфиксируется (когда сеанс сбрасывается по умолчанию) - поэтому, если вы не сбросите сеанс вручную (не рекомендуется), он все равно останется в вашей БД.

Надеюсь, это поможет.

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