sqlite - nhibernate 事务和单元测试

标签 sqlite nhibernate testing transactions

我有一段代码,如下所示:

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 profiler 中查看时,我可以看到开始事务语句,但它后面既没有提交也没有回滚。
更重要的是,即使我放在那里 try-catch block 并在 catch 中显式执行 Rollback,我的测试仍然失败。
我认为测试环境存在一些问题,但对我来说一切似乎都很好。

有什么想法吗?

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

最佳答案

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

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

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

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

相关文章:

android - SQLite 的 s3db 文件是否可以从 Windows 移植到 iOS/Android 平台?

c# - 替换 ASP.net MVC 核心中的 DefaultModelBinder

testing - 我如何从 testcafe 框架自定义 testRunner?

c# - 取 LINQ 中每个分组项目的 Top(X)

angular - 单元测试语法错误 : DOM Exception 12 angular 5

java - 在 jUnit 的 assertEquals() 方法中计算 expected_value 的最佳方法是什么

database - SQLite 与文本文件数据库 - 大小比较?

sqlite - 删除sqlite中某个日期的记录?

windows - 如何在 Windows 10 计算机上执行 "install"sqlite3?

nhibernate - HQL:按其 map 中的特定项目对所有项目进行排序