Nhibernate单元测试。子类不能使用Base类属性

时间:2013-07-24 13:04:44

标签: unit-testing nhibernate fluent-nhibernate mstest

我正在使用Fluent NHibernate并尝试进行单元测试。现在我有一个基本测试类,如下所示:

[TestClass]
public abstract class BaseTest<TEntity> where TEntity : IBaseModel
{
    private const string testDbFile = "test.db";
    private static ISessionFactory sessionFactory;
    protected static ISession session;

    [TestMethod]
    public void configureDB()
    {
        try
        {
            if (sessionFactory == null)
            {
                sessionFactory = Fluently.Configure()
                                .Database(SQLiteConfiguration.Standard
                                    .UsingFile(testDbFile))
                                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AdminTest>())
                                .ExposeConfiguration(BuildSchema)
                                .BuildSessionFactory();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException.Message);
        }
    }

    private static void BuildSchema(Configuration config)
    {
        new SchemaUpdate(config).Execute(false, true);
    }

    [TestMethod]
    public void sessionCreated()
    {
        session = sessionFactory.OpenSession();
    }

    [TestMethod]
    public virtual void AddEntity_EntityWasAdded()
    {
        var entity = BuildEntity();

        InsertEntity(entity);

        session.Evict(entity);

        var reloadedEntity = session.Get<TEntity>(entity.Id);

        Assert.IsNotNull(reloadedEntity);
        AssertAreEqual(entity, reloadedEntity);
        AssertValidId(reloadedEntity);
    }

还有其他方法可以更新和删除实体。我有AdminTest类继承BaseTest。在AdminTest我有以下方法:

[TestClass]
public class AdminTest : BaseTest<Admin>
{
    [TestMethod]
    public void SelectWorks()
    {
        IList<Admin> admins = session.QueryOver<Admin>().List();
        Assert.AreNotEqual(0, admins.Count);
    }
}

这里我总是有例外,因为会话是null。也许我认为视觉工作室如何执行单元测试(我是新手)是错误的? 现在我认为,视觉工作室以下列方式工作

  1. BaseTest运行测试方法(在那里配置数据库并创建会话)
  2. 运行selectWorks方法。在这里,我认为它应该使用session
  3. 中的BaseTest

    你能解释一下我的思维方式有什么问题吗?我希望能够从子类中查询,这样做的正确方法是什么? 谢谢,任何帮助表示赞赏,

1 个答案:

答案 0 :(得分:0)

我建议在您的抽象基类中使用[TestInitialize]和[TestCleanup]并执行以下操作:

    [TestInitialize]
    public void TestInitialize()
    {
        Console.Out.WriteLine("Get a ISession object");
    }

    [TestCleanup]
    public void TestCleanup()
    {
        Console.Out.WriteLine("Dispose ISession");
    }

然后在你的孩子班继续做你正在做的事情:

    [TestMethod]
    public void DoDbWork()
    {
        Console.Out.WriteLine("Running a query via nhibernate");
    }

您真的只想确保每个测试都有一个干净的会话。 TestInitialize和TestCleanup的属性将在每个单元测试之前和之后运行。 Here是这些属性的文档。

为确保您的ISession处于正确状态,请执行this之类的操作。