Почему вызов Session.Clear () приводит к сбою этого теста? - PullRequest
2 голосов
/ 19 июля 2010

Ниже приведен простой тест репозитория с FluentNHibernate-1.1.0.685 (NHibernate-2.1.2.4000). Session и NH config предоставляются тестовым прибором.

[Test] public void ShouldEdit() {
    var employee = CreateEmployee();
    session.Clear();

    var changedEmployee = _testRepository(employee.id);
    changedEmployee.FirstName = "Ringo";
    _testRepository.SaveOrUpdate(changedEmployee);

    session.Flush();
    session.Clear(); // Pulling this call will allow the test to pass.

    var employees = (IList)_testRepository.GetAll();
    Assert.Contains(changedEmployee, employees);
    Assert.IsFalse(employees.Contains(employee));
}

Employee CreateEmployee() {
    var e = {Id = 1, FirstName = "George", LastName = "Washington" };
    _testRepository.SaveOrUpdate(e);
    session.Flush();
    return e;
}

Этот тест пройдет, если я избавлюсь от второго вызова Clear (). Однако, если я оставлю вызов, то тест не пройдёт со следующим:

Failed:
Expected: Collection containing <Employee>
But was: < <Employee> >

Не очень полезно. Оставляя это в стороне, зачем мне удалять второй вызов Clear ()?

Flush () будет синхронизироваться с БД, и, если я правильно понимаю документацию , Clear () удалит кэш сеанса. Кажется, это именно то поведение, которое я хочу, чтобы быть уверенным, что я не проверяю устаревшие данные. Фактически, я ожидаю, что тест не пройдёт без вызова Clear (), но это не так. Может кто-нибудь пролить свет на это поведение?

(Примечание. Это вариант теста репозитория, описанного в главе 10 книги PragProg "Test Drive ASP.Net MVC". Кстати, хорошая книга).

1 Ответ

7 голосов
/ 19 июля 2010

Поскольку ваш метод Contains проверяет равенство ссылок, тогда как вы, вероятно, хотите проверить равенство с помощью идентификатора или имени сотрудника.

Вызов Clear () удалит ссылку на changeEmployee из сеанса NHibernate (выигран NHibernateне используйте эту ссылку больше).Это означает, что при перезагрузке сотрудников создается новый экземпляр измененного сотрудника.Эта ссылка не пройдет проверку на равенство ссылок с исходным объектом changeEmployee (хотя все его свойства должны быть одинаковыми).

Без Clear () NHibernate поддерживает ссылку на объект changeEmployee и эту же ссылкувозвращается методом GetAll.

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