EDITED数据库初始化运行所
我运行了databsae初始化方法的单元测试(使用NUnit)。我设置的测试,并使用该种子与测试实例数据库:
[TestFixtureSetUp]
public void SetUp()
{
//select database
Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
database = new POSDatabaseContext(connectionString);
//drop database and recreate
string query = "ALTER DATABASE [POS] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";
database.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, query);
database.Database.Delete();
database.Database.Create();
//add seed value to test against
database.Metadata.Add(new Metadata {
ID = "META",
IsInitialized = false,
testBool = true,
TimeCreated = DateTime.Now,
TimeEdited = DateTime.Now
});
database.SaveChanges();
}
我然后运行测试方法,该方法是这样的:
[Test]
public void InitializeDatabaseTestWithMatchingModel()
{
//set initializer for data context to test it, and run it
Database.SetInitializer<POSDatabaseContext>(new
CustomDropCreateDatabaseWithMatchingModelTest());
database.Database.Initialize(true);
//use the metadata table to check if it was run correctly
//if metadata exist, which it should
if(database.Metadata.Any(s => s.ID == "META"))
{
Metadata actual = database.Metadata.Single(s => s.ID == "META");
Assert.IsTrue(actual.IsInitialized);
}
else
throw new Exception("The Database was not seeded correctly for the test");
}
为了测试我的自定义初始化程序我做了一个继承自它的类我可以使用Seed()方法来创建一些我可以测试的数据。这是类:
和阶级它来源于:
//This file contains custom versions of the built in
//database intializer classes in which an SQL Statement
//is run to stop all connections to the database so that
//when the database is dropped, a database in use
//exception is not thrown.
public class CustomDropCreateDatabaseIfModelChanges<Context>
: IDatabaseInitializer<Context> where Context : DbContext
{
public void InitializeDatabase(Context context)
{
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(true))
{
string query = "ALTER DATABASE [POS] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, query);
context.Database.Delete();
context.Database.Create();
}
//else do nothing and continue
}
else context.Database.Create();
//run seed method
Seed(context);
}
//OVERIDE ME
//this method seeds the database with data
protected virtual void Seed(Context context) { }
}
这个问题我似乎有是至开机不运行,直到断言之后。我已经检查了元数据的实际值,这些值是来自SetUp()方法的值。我还检查了在我测试的方法中调用SaveChanges()之前,对象被标记为已修改。但是,该方法肯定是在运行,因为数据库反映了该方法的值。
原以为我遇到的问题是IsInitialized属性被返回为错误的值,因为它在数据库中为1,但我在代码中得到了错误。
您是否尝试过设置另一个布尔属性?如果你第一次错过任何东西,这可能会导致一个洞察。 – Archangel33 2014-09-19 14:20:40
我正在考虑这样做,但我不知道如何使用它。这很困难,因为我希望它有不同的用法来测试它。我认为。 – some1one 2014-09-19 14:24:58
对不起,编辑过,我在发布代码时错过了这些。该字符串在我的代码中是相同的。 – some1one 2014-09-19 14:31:37