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

ここでは、セッションが であるため、常に例外がありnullます。ビジュアルスタジオが単体テストを実行する方法についての考え方が間違っているのかもしれません (私は初心者です)。今思うと、ビジュアルスタジオは以下のように動いています

  1. テストメソッドを実行BaseTestします(データベースを構成し、セッションを作成します)
  2. メソッドを実行しselectWorksます。ここsessionから使用する必要があると考えていましたBaseTest

私の考え方のどこが間違っているのか説明してもらえますか? そして、子クラスからクエリできるようにしたいのですが、正しい方法は何ですか? ありがとう、助けていただければ幸いです。

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 に答える