Unit testing NHibernate单元测试用例101

Unit testing NHibernate单元测试用例101,unit-testing,nhibernate,Unit Testing,Nhibernate,我发现了Ayende在使用SQLite为NHib单元测试创建一个简单的基本测试夹具时所做的工作 我这里的问题是具体测试夹具中测试用例的代码。在下面的EX_1中,Ayende在提交的事务中封装了save和fetch,并有一个会话。中间清除。当然,这是可行的,但EX_2也是如此 在所有条件相同的情况下,我更喜欢更紧凑、可读性更强的EX_2。有没有想过为什么EX_1中的附加代码值得一点混乱 干杯, 贝里尔 ==EX_1===== [Fact] public void CanSaveAndLoadBlo

我发现了Ayende在使用SQLite为NHib单元测试创建一个简单的基本测试夹具时所做的工作

我这里的问题是具体测试夹具中测试用例的代码。在下面的EX_1中,Ayende在提交的事务中封装了save和fetch,并有一个会话。中间清除。当然,这是可行的,但EX_2也是如此

在所有条件相同的情况下,我更喜欢更紧凑、可读性更强的EX_2。有没有想过为什么EX_1中的附加代码值得一点混乱

干杯,
贝里尔

==EX_1=====

[Fact]
public void CanSaveAndLoadBlog_EX_1()
{
    object id;

    using (var tx = session.BeginTransaction())
    {
        id = session.Save(new Blog
        {
            AllowsComments = true,
            CreatedAt = new DateTime(2000,1,1),
            Subtitle = "Hello",
            Title = "World",
        });

        tx.Commit();
    }

    session.Clear();


    using (var tx = session.BeginTransaction())
    {
        var blog = session.Get<Blog>(id);

        Assert.Equal(new DateTime(2000, 1, 1), blog.CreatedAt);
        Assert.Equal("Hello", blog.Subtitle);
        Assert.Equal("World", blog.Title);
        Assert.True(blog.AllowsComments);

        tx.Commit();
    }
}
[事实]
public void可以保存并加载blog_EX_1()
{
对象id;
使用(var tx=session.BeginTransaction())
{
id=会话。保存(新博客)
{
AllowsComments=true,
CreatedAt=新日期时间(2000,1,1),
Subtitle=“你好”,
Title=“世界”,
});
tx.Commit();
}
session.Clear();
使用(var tx=session.BeginTransaction())
{
var blog=session.Get(id);
Assert.Equal(新的日期时间(2000,1,1),blog.CreatedAt);
Assert.Equal(“你好”,blog.Subtitle);
Assert.Equal(“世界”,blog.Title);
True(blog.AllowsComments);
tx.Commit();
}
}
==EX_2=====

[Fact]
    public void CanSaveAndLoadBlog_EX_2()
    {
        var id = session.Save(new Blog
                                 {
                                     AllowsComments = true,
                                     CreatedAt = new DateTime(2000, 1, 1),
                                     Subtitle = "Hello",
                                     Title = "World",
                                 });

        var fromDb = session.Get<Blog>(id);

        Assert.Equal(new DateTime(2000, 1, 1), fromDb.CreatedAt);
        Assert.Equal("Hello", fromDb.Subtitle);
        Assert.Equal("World", fromDb.Title);
        Assert.True(fromDb.AllowsComments);

    }
[事实]
public void可以保存并加载blog_EX_2()
{
var id=session.Save(新建博客)
{
AllowsComments=true,
CreatedAt=新日期时间(2000,1,1),
Subtitle=“你好”,
Title=“世界”,
});
var fromDb=session.Get(id);
Assert.Equal(新的日期时间(2000,1,1),fromDb.CreatedAt);
Assert.Equal(“Hello”,fromDb.Subtitle);
Assert.Equal(“世界”,fromDb.Title);
True(fromDb.AllowsComments);
}

我相信NHibernate鼓励您使用事务,即使您只是在查询。检查这篇文章


此外,根据您使用的主键类型,EX_2代码可能不会命中数据库。如果您使用的是自动递增的标识键,NHibernate将命中数据库并获取主键,但如果您使用guid、guid.comb或hilo,则根本不会命中数据库。因此,您的Get将获取NHibernate缓存在内存中的内容,除非您执行提交更改,然后清除会话,这样您就知道内存中没有任何内容。

我相信,使用NHibernate,即使您只是查询,也鼓励您使用事务。检查这篇文章


此外,根据您使用的主键类型,EX_2代码可能不会命中数据库。如果您使用的是自动递增的标识键,NHibernate将命中数据库并获取主键,但如果您使用guid、guid.comb或hilo,则根本不会命中数据库。因此,您的Get将获取NHibernate缓存在内存中的内容,除非您执行提交更改,然后清除会话,这样您就知道内存中没有任何内容。

@Emmanuel-我不知道在Hibernate中总是使用事务进行读取操作。谢谢你指出这一点。文档的第11.2章似乎也证实了这一点()“始终使用清晰的事务边界,即使对于只读操作也是如此。”@Emmanuel-我不知道在Hibernate中始终使用事务进行读取操作。谢谢你指出这一点。文档的第11.2章似乎也证实了这一点()“始终使用清晰的事务边界,即使对于只读操作也是如此。”