如何在从模式文件运行测试之前创建一个新数据库(每次)?
答案 0 :(得分:4)
您可以在NHibernate中使用SchemaExport类在代码中执行此操作:
var schema = new SchemaExport(config);
schema.Drop(true, true);
schema.Execute(true, true, false);
答案 1 :(得分:1)
删除整个数据库 - 不要逐表删除 - 这会增加太多的维护开销
答案 2 :(得分:1)
我已经使用以下实用程序方法来运行SQL脚本,以便在我不时使用的项目中设置数据库和测试数据。它工作得很好:
internal static void RunScriptFile(SqlConnection conn, string fileName)
{
long fileSize = 0;
using (FileStream stream = File.OpenRead(fileName))
{
fileSize = stream.Length;
using (StreamReader reader = new StreamReader(stream))
{
StringBuilder sb = new StringBuilder();
string line = string.Empty;
while (!reader.EndOfStream)
{
line = reader.ReadLine();
if (string.Compare(line.Trim(), "GO", StringComparison.InvariantCultureIgnoreCase) == 0)
{
RunCommand(conn, sb.ToString());
sb.Length = 0;
}
else
{
sb.AppendLine(line);
}
}
}
}
}
private static void RunCommand(SqlConnection connection, string commandString)
{
using (SqlCommand command = new SqlCommand(commandString, connection))
{
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Exception while executing statement: {0}", commandString));
Console.WriteLine(ex.ToString());
}
}
}
我使用Database Publishing Wizard生成SQL脚本(在某些情况下编辑它们以仅包含我想在测试中使用的数据),并将脚本文件路径传递到{{1}测试之前的方法。该方法解析脚本文件并分别执行由RunScriptFile
行分隔的每个部分(我发现这极大地帮助解决了在运行SQL脚本时发生的错误)。
自从我编写代码以来,我已经有一段时间了,但我认为它要求脚本文件以GO
行结束,以便执行最后一部分。
答案 3 :(得分:0)
看看这些帖子。
Ayende Rahien - nhibernate-unit-testing
Scott Muc - unit-testing-domain-persistence-with-ndbunit-nhibernate-and-sqlite
我发现它们非常有用,基本上他们正在扩展Mike Glenn的例子
答案 4 :(得分:0)
我使用Proteus(单元测试实用程序),可在此处使用Google代码:
http://code.google.com/p/proteusproject/
您创建一组数据。每次,您运行单元测试,保存当前数据,加载数据集,然后您始终使用相同的数据集进行测试。最后,原始数据将被恢复。
非常强大
HTH