0

我正在使用 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);
    }
}

在这里我总是有例外,因为 session 是null. 也许我在思考视觉工作室如何执行单元测试的方式上是错误的(我是新手)?现在我这样想,视觉工作室的工作方式如下

  1. 从中运行测试方法BaseTest(它在那里配置数据库并创建会话)
  2. 运行selectWorks方法。在这里我想它应该使用sessionfromBaseTest

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

4

1 回答 1

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 的属性将在每个单元测试之前和之后运行。 是这些属性的文档。

为确保您的 ISession 处于正确状态,请遵循以下内容。

于 2013-07-24T18:30:33.540 回答