【问题标题】:Why does calling Session.Clear() cause this test to fail?为什么调用 Session.Clear() 会导致此测试失败?
【发布时间】:2010-07-19 01:01:27
【问题描述】:

以下是针对 FluentNHibernate-1.1.0.685 (NHibernate-2.1.2.4000) 的存储库的简单测试。 Session 和 NH 配置由测试夹具提供。

[测试] public void ShouldEdit() { var 员工 = CreateEmployee(); 会话.清除(); var changedEmployee = _testRepository(employee.id); changedEmployee.FirstName = "林戈"; _testRepository.SaveOrUpdate(changedEmployee); session.Flush(); 会话.清除(); // 拉这个调用将允许测试通过。 var employees = (IList)_testRepository.GetAll(); Assert.Contains(changedEmployee, employees); Assert.IsFalse(employees.Contains(employee)); } 员工 CreateEmployee() { var e = {Id = 1, FirstName = "George", LastName = "Washington" }; _testRepository.SaveOrUpdate(e); session.Flush(); 返回 e; }

如果我摆脱对 Clear() 的第二次调用,该测试将通过。但是,如果我留下电话,那么测试将失败并显示以下内容:

失败的: 预期:包含 的集合 但是是: >

不是很有帮助。撇开这些不谈,为什么我需要删除对 Clear() 的第二次调用?

Flush() 将与数据库同步,如果我正确理解 documentation,Clear() 将驱逐会话缓存。这似乎正是我想要的行为,因此我可以确定我没有针对过时的数据进行测试。事实上,我希望测试失败没有调用 Clear(),但事实并非如此。有人可以解释一下这种行为吗?

(注意:这是在 PragProg 书籍“Test Drive ASP.Net MVC”的第 10 章中找到的存储库测试的变体。顺便说一句,好书。)

【问题讨论】:

    标签: c# unit-testing nhibernate testing fluent-nhibernate


    【解决方案1】:

    因为您的 Contains 方法正在检查引用是否相等,而您可能希望使用 Id 或员工姓名检查是否相等。

    调用 Clear() 将从 NHibernate 的会话中删除对 changedEmployee 的引用(NHibernate 将不再使用此引用)。这意味着当您重新加载员工时,会创建已更改员工的新实例。此引用不会通过与原始 changedEmployee 对象的引用相等性检查(尽管它的所有属性都应该相同)。

    没有 Clear(),NHibernate 维护对 changedEmployee 对象的引用,GetAll 方法返回这个相同的引用。

    【讨论】:

    • 谢谢。这很有道理。
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多