Ниже приведен простой тест репозитория с 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". Кстати, хорошая книга).