gpt4 book ai didi

sqlite - 休眠事务和单元测试

转载 作者:行者123 更新时间:2023-11-28 20:06:31 25 4
gpt4 key购买 nike

我有一段代码看起来像这样:

public void Foo(int userId)
{
try {
using (var tran = NHibernateSession.Current.BeginTransaction())
{
var user = _userRepository.Get(userId);
user.Address = "some new fake user address";
_userRepository.Save(user);
Validate();
tran.Commit();
}
}
catch (Exception) {
logger.Error("log error and don't throw")
}
}

private void Validate()
{
throw new Exception();
}

我想对验证件是否正确进行单元测试。我使用 nunit 和 SQLLite 数据库进行测试。这是测试代码:

protected override void When()
{
base.When();
ownerOfFooMethod.Foo(1);
Session.Flush();
Session.Clear();
}

[Test]
public void FooTest()
{
var fakeUser = userRepository.GetUserById(1);
fakeUser.Address.ShouldNotEqual("some new fake user address");
}

我的测试失败了。
在调试时,我可以看到抛出异常,尚未调用 Commit。但是我的用户在 Address 属性中仍然有“一些新的假用户地址”,尽管我期望它会被回滚。
当我在 nhibernate 分析器中查看时,我可以看到开始事务语句,但它后面既没有提交也没有回滚。
更重要的是,即使我把 try-catch block 放在那里并在 catch 中显式地执行回滚,我的测试仍然失败。
我假设,测试环境中存在一些问题,但对我来说一切似乎都很好。

有什么想法吗?

编辑:我添加了重要的 try-catch block (一开始我简化了太多代码)。

最佳答案

如果在 NH 将更改刷新到数据库之前发生异常,并且如果您继续使用该 session 而不驱逐/清除对象并且由于某种原因稍后发生刷新,则更改仍将被保留,因为对象根据 NHibernate 仍然是脏的。回滚事务时应立即关闭 session 以避免此类问题。

换一种说法:回滚不会回滚您对持久实体所做的内存中更改。

此外,如果 session 是常规 session ,则不需要调用 Save(),因为实例已被 NH 跟踪。

关于sqlite - 休眠事务和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381506/

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