ner*_*aga 2 c# testing nhibernate unit-testing fluent-nhibernate
以下是针对FluentNHibernate-1.1.0.685(NHibernate-2.1.2.4000)的存储库的简单测试.Session和NH配置由测试夹具提供.
[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()将与db同步,如果我正确理解文档,Clear()将逐出缓存.这似乎正是我想要的行为,所以我可以肯定我没有测试陈旧的数据.事实上,如果没有调用Clear(),我会期望测试失败,但事实并非如此.有人可以对这种行为有所了解吗?
(注意:这是对PragProg书籍"Test Drive ASP.Net MVC"第10章中的存储库测试的变体.好书顺便说一下.)
因为您的Contains方法正在检查引用相等性,而您可能希望使用Id或员工的名称来检查是否相等.
调用Clear()将从NHibernate的Session中删除对changedEmployee的引用(NHibernate将不再使用此引用).这意味着当您重新加载员工时,将创建已更改员工的新实例.此引用不会传递与原始的changedEmployee对象的引用相等性检查(尽管它的所有属性应该相同).
如果没有Clear(),NHibernate会维护对changedEmployee对象的引用,并且GetAll方法会返回相同的引用.
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |