单元测试服务层 - NUnit,NHibernate

时间:2010-03-17 09:42:59

标签: unit-testing nhibernate nunit

我想对DEPENDENT服务层进行单元测试,这允许我在不使用NUnit进行模拟的情况下执行CRUD操作。我知道这可能是不好的做法,但无论如何我想尝试一下 - 即使测试必须经过一夜。我的数据是使用NHibernate持久保存的,我已经实现了一个“引导”数据库的小库,我可以在[Setup]方法中使用它。我只是想知道是否有人做了类似的事情以及引导数据库的最快方法是什么。我正在使用这样的东西:

var cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly("Bla");
            new SchemaExport(cfg).Execute(false, true, false);

建立db模式。之后,我从一些Excel表中填充了一些查找表。

非常感谢任何反馈。感谢。

基督教

2 个答案:

答案 0 :(得分:2)

在编写集成测试时,要记住最重要的事情仍然是

  • 尽可能自动化(最好是一切),包括设置数据库并在使用后再次删除
  • 避免General Fixture反模式,这意味着每个测试用例应以空数据库开头,并使用Back Door Manipulation填充适当的行。

我过去曾多次写过my own experiences with testing against databases

答案 1 :(得分:2)

Ayende在这个blog post中有一个很好的例子。他的例子如下所示。

由于配置的创建成本很高,因此每次测试运行仅创建一次。使用SQLite内存数据库,因为这是执行查询的最快方法。

public class InMemoryDatabaseTest : IDisposable
{
    private static Configuration Configuration;
    private static ISessionFactory SessionFactory;
    protected ISession session;

    public InMemoryDatabaseTest(Assembly assemblyContainingMapping)
    {
        if (Configuration == null)
        {
            Configuration = new Configuration()
                .SetProperty(Environment.ReleaseConnections,"on_close")
                .SetProperty(Environment.Dialect, typeof (SQLiteDialect).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionString, "data source=:memory:")
                .SetProperty(Environment.ProxyFactoryFactoryClass, typeof (ProxyFactoryFactory).AssemblyQualifiedName)
                .AddAssembly(assemblyContainingMapping);

            SessionFactory = Configuration.BuildSessionFactory();
        }

        session = SessionFactory.OpenSession();

        new SchemaExport(Configuration).Execute(true, true, false, true, session.Connection, Console.Out);
    }

    public void Dispose()
    {
        session.Dispose();
    }
}

使用此功能时,每个测试都以创建所需数据开始。

public class BlogTestFixture : InMemoryDatabaseTest
{
    public BlogTestFixture() : base(typeof(Blog).Assembly)
    {
    }

    [Fact]
    public void CanSaveAndLoadBlog()
    {
        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();
        }
    }
}