我正在使用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
。也许我认为视觉工作室如何执行单元测试(我是新手)是错误的?
现在我认为,视觉工作室以下列方式工作
BaseTest
运行测试方法(在那里配置数据库并创建会话)selectWorks
方法。在这里,我认为它应该使用session
BaseTest
醇>
你能解释一下我的思维方式有什么问题吗?我希望能够从子类中查询,这样做的正确方法是什么? 谢谢,任何帮助表示赞赏,
答案 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之类的操作。