我是最小起订量新手,刚刚开始一个已经在开发的项目。我负责设置单元测试。 DatabaseFactory 有一个使用 EnterpriseLibrary 的自定义类,如下所示:
public Database CreateCommonDatabase()
{
return CreateDatabaseInstance(string.Empty);
}
private static Database CreateDatabaseInstance(string foo)
{
var database = clientCode == string.Empty
? DatabaseFactory.CreateDatabase("COMMON")
: new OracleDatabase(new ClientConnections().GetConnectionString(foo)));
return database;
}
现在,这是使用它的地方(ResultData 是 DataSet 类型的另一个类):
public ResultData GetNotifications(string foo, string foo2, Database database)
{
var errMsg = string.Empty;
var retval = 0;
var ds = new DataSet();
var sqlClause =
@"[Some SELECT statement here that uses foo]";
DbCommand cm = database.GetSqlStringCommand(sqlClause);
cm.CommandType = CommandType.Text;
// Add Parameters
if (userSeq != string.Empty)
{
database.AddInParameter(cm, ":foo2", DbType.String, foo2);
}
try
{
ds = database.ExecuteDataSet(cm);
}
catch (Exception ex)
{
retval = -99;
errMsg = ex.Message;
}
return new ResultData(ds, retval, errMsg);
}
现在,最初,数据库没有作为参数传入,但该方法使用 CreateCommonDatabase 方法创建 DatabaseFactory 的新实例,并从那里使用它。然而,这使得该类无法测试,因为我无法阻止它实际访问数据库。因此,我使用依赖注入,并传入数据库。
现在,我陷入困境,因为没有办法模拟数据库来测试 GetNotifications。我想知道我是否把事情过于复杂化了,或者我是否遗漏了一些东西。我这样做的方式正确吗?或者我应该重新考虑如何进行设置?
编辑以添加更多信息*****
我真的不想测试数据库。我希望 Data.Notifications 类(上面)返回 ResultData 的实例,但这就是我真正想要测试的全部。如果我上升到业务层,我会得到以下内容:
public DataSet GetNotifications(string foo, string foo1, out int returnValue, out string errorMessage, Database database)
{
ResultData rd = new data.Notifications().GetNotifications(foo, foo1, database);
returnValue = rd.ResultValue;
errorMessage = rd.ErrorMessage;
return rd.DataReturned;
}
所以,最初,数据库没有传入,而是由 Data.Notifications 类创建的 - 但话又说回来,如果我这样保留它,我就忍不住要访问数据库来测试这个业务层对象。我修改了所有代码以传递数据库(它创建了网络的基本页面),但现在我不确定下一步要做什么。我以为我只需要一个单元测试就可以解决这个问题,但显然,要么我错了,要么我在正确的道路上遇到了心理障碍。