【发布时间】:2017-05-08 14:28:56
【问题描述】:
我有一个名为 Database 的类,它实现了以下接口;
public interface IDatabase
{
int ExecuteNonQuery(string command, CommandType commandType, Dictionary<string, object> parameters);
}
顾名思义,ExecuteNonQuery 函数以与提供者无关的方式执行非查询数据库命令。
我需要为这个类编写集成测试,到目前为止我已经为Sql Server Compact Edition编写了一个集成测试,它通过了测试。
这里是集成测试代码;
public class DatabaseIntegrationTests
{
private readonly string CurrentDir;
private readonly string SqlCeDbPath;
public DatabaseIntegrationTests()
{
CurrentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
SqlCeDbPath = CurrentDir + @"\TestDb.sdf";
}
[Fact]
public void ExecuteNonQuery_SqlServerCE_Should_Execute()
{
var dbConfFunc = this.InitializeSqlServerCeInstance();
Database database = new Database(dbConfFunc);
database.ExecuteNonQuery("CREATE TABLE Test([ID] [bigint] IDENTITY(1,1) NOT NULL,[Message] [nvarchar](255) NULL)",
CommandType.Text, null);
var parameters = new Dictionary<string, object>();
parameters.Add("@message", "Hello World!");
database.ExecuteNonQuery("INSERT INTO Test(Message) VALUES(@message)",
CommandType.Text, parameters);
CleanUpSqlServerCe();
}
private void CleanUpSqlServerCe()
{
if (File.Exists(SqlCeDbPath))
File.Delete(SqlCeDbPath);
}
private Func<DbConnectionConfiguration> InitializeSqlServerCeInstance()
{
string connectionString = "Data Source=" + CurrentDir + @"\ASTest.sdf;Persist Security Info=False";
CleanUpSqlServerCe();
SqlCeEngine engine = new SqlCeEngine(connectionString);
engine.CreateDatabase();
return () =>
{
return new DbConnectionConfiguration()
{
DataProvider = "System.Data.SqlServerCe.4.0",
ConnectionString = connectionString
};
};
}
}
我的问题是,如何为这个类为 MySql 和 Sql Server 数据库提供者编写集成测试? 为这个类编写集成测试以测试 MySql 和 Sql Server 数据库的最实用方法是什么?
【问题讨论】:
-
识别最有可能在测试之间更改的代码,并创建一个抽象的基础测试类,以便为每个测试进行必要的更改
-
问问自己您要验证什么行为。您编写了一个包装类,因此您可以对依赖于数据库的其他代码进行单元测试。您不需要显式测试包装器。您应该对使用数据库抽象的方法进行集成测试,这将彻底验证您的包装器。
-
@DanielMann 是的。它是一个数据访问层的包装类,应该适用于 mysql、sql server 和 sql server 精简版。我不应该为它写一个集成测试吗?
标签: c# .net testing integration-testing