gpt4 book ai didi

unit-testing - 用于测试的 NHibernate Load 与 Get 行为

转载 作者:行者123 更新时间:2023-12-04 04:58:29 25 4
gpt4 key购买 nike

在简单的测试中,我可以通过对象的 Id 是否不再是默认值来断言对象是否已被持久化。但是删除一个对象并想要检查该对象及其子对象是否真的不在数据库中,对象 ID 仍将保持其保存的值。

所以我需要去数据库,我想要一个辅助断言来使测试更具可读性,这就是问题所在。我喜欢使用 Load 来保存数据库调用的想法,但我'我想知道随之而来的异常是否会破坏 session 。

我认为以下是这两个断言的外观。你会用哪个?

干杯,
贝里尔

获取

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));
}

加载

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
}
}

编辑

无论哪种情况,我都会在新 session 中执行提取(获取或加载),而不受执行保存或删除的 session 的状态影响。

我正在尝试测试级联行为,而不是测试 NHib 删除内容的能力,但也许我想太多了,或者有一种我没有想到的更简单的方法。

最佳答案

“Load”部分中的代码将始终命中 Assert.Fail,但永远不会抛出异常,如 Load<T>将返回一个代理(设置了 Id 属性 - 或从一级缓存填充),而无需访问数据库 - 即。仅当您访问已删除实体上的 Id 属性以外的属性时,ISession.Load 才会失败。

至于你的“获取”部分 - 我可能是错的,但我认为如果你在 session 中删除一个实体 - 然后尝试在同一个 session 中使用 .Get - 你将在第一级获得该实体缓存 - 再次不返回 null。

查看此post有关 .Load 和 .Get 的完整说明。

如果您确实需要查看它是否在您的数据库中 - 使用 IStatelessSession - 或启动子 ISession(它将有一个空的一级缓存。

编辑:我想到了一个更大的问题 - 当事务提交时(默认情况下刷新 session 时),您的实体将首先被删除 - 所以除非您手动刷新 session (不推荐),否则您仍然会拥有它在您的数据库中。

希望这有帮助。

关于unit-testing - 用于测试的 NHibernate Load 与 Get 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7248370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com