NHibernate单元测试用例101

时间:2009-12-28 18:13:50

标签: unit-testing nhibernate

我发现我认为Ayende为great article创建了一个简单的基础测试夹具,用于使用SQLite进行NHib单元测试。

我的问题是具体测试夹具中的测试用例代码。在下面的EX_1中,Ayende包含了他提交的事务中的保存提取,并且在它们之间有一个Session.Clear。这当然有效,但EX_2也是如此。

所有条件相同我更喜欢更紧凑,更易读的EX_2。有关为什么EX_1中的附加代码值得一点混乱的想法?

干杯,
Berryl

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

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

    }

1 个答案:

答案 0 :(得分:1)

我相信NHibernate即使您只是在查询时也鼓励使用交易。请查看此文章http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

此外,您的EX_2代码可能无法访问数据库,具体取决于您使用的主键类型。如果您正在使用自动增量的Identity密钥,NHibernate将访问数据库并获取主键,但如果您使用guid,guid.comb或hilo,则根本不会访问数据库。所以你的Get会抓住NHibernate在内存中缓存的内容,除非你做一个提交更改然后清除会话,这样你才知道内存中没有任何内容。