在您的 NUnit Setup 和 TearDown 方法中,您需要在数据库中删除并创建指定的表(使用脚本)。因此,在每次测试运行之前和之后,您的所有数据当然都会被删除,只留下空表供您测试。
下面的例子使用的是MySql数据库,但即使是其他数据库,代码也应该差不多:
public class DatabaseCleanup
{
private string _connectionString;
private MySqlConnection _mySqlConnection;
private string _filePath;
public DatabaseCleanup()
{
_filePath = @"C:\createdatabase.sql";
_connectionString = @"Server=localhost;Port=3306;Database=dbname;Uid=username;Password=password;";
_mySqlConnection = new MySqlConnection(_connectionString);
}
public void Create()
{
string script = File.ReadAllText(_filePath);
ExecuteScript(script);
}
private void ExecuteScript(string script)
{
try
{
MySqlCommand command = new MySqlCommand(script, _mySqlConnection);
_mySqlConnection.Open();
command.ExecuteNonQuery();
_mySqlConnection.Close();
}
catch (Exception exception)
{
throw;
}
finally
{
_mySqlConnection.Close();
}
}
}
上述代码中提到的脚本createdatabase.sql 只是一个包含drop table 和create table 语句的sql 文件,您可以根据您的数据库提供这些语句。以下只是一个示例:
DROP TABLE IF EXISTS `my_table`;
CREATE TABLE `my_table` (
`Id` varchar(50) NOT NULL,
`Name` varchar(50) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后您可以在 NUnit 测试类的 Setup 和 TearDown 方法中使用 DatabaseCleanup 类:
DatabaseCleanup databaseCleanup = new DatabaseCleanup();
databaseCleanup.Create();
注意不要在生产环境中运行此数据库清理代码。仅在开发和测试环境中运行此类测试。
P.S.,我不喜欢人们在这里说要使用像 SqlLite 这样的内存数据库。这完全违背了集成测试的全部目的。这意味着在您的开发环境中使用不同的数据库测试您的代码,然后在生产服务器上的不同数据库平台上进行部署;然后面对一场噩梦!