我们在代码库中有几个地方,我们会做类似以下的事情:
DataTable dt = new DataTable();
using (DatabaseContext context = DatabaseContext.GetContext(false)) {
IDbCommand cmd = context.CreateCommand("SELECT * FROM X");
SqlDataAdapter dataAdapter = new SqlDataAdapter((SqlCommand)cmd);
dataAdapter.Fill(dt);
}
return dt;
我们如何使用像Moq这样的模拟测试框架来删除我们对数据库的测试依赖?我想模拟返回的DataTable。
澄清:我们计划更改此代码但目前不能。是否有可能按原样嘲笑?
答案 0 :(得分:2)
我建议使用 Repository 模式,该模式会隐藏存储库中所有特定于数据库的代码。您可以模拟存储库,以便在上面的层中测试您的逻辑。
使用存储库分隔检索数据的逻辑 从作用于的业务逻辑将其映射到实体模型 模型。业务逻辑应该与数据类型无关 包括数据源层。例如,数据源层 可以是数据库,SharePoint列表或Web服务。
存储库在数据源层和业务之间进行调解 应用层。它在数据源中查询数据, 将数据从数据源映射到业务实体,并持续存在 业务实体中的更改到数据源。存储库 将业务逻辑与与底层的交互分开 数据源或Web服务。
答案 1 :(得分:1)
通过无法更改代码我认为你的意思是你不能做一个大的重构。这就是我的建议。
这种模式被称为“提取和覆盖”,它是好书中提到的众多模式之一 - http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052。
有些人可能不喜欢您正在添加虚拟方法仅用于测试。那么,这只是第一步。你说你有重构的计划。然后进行测试非常重要,这样你就可以确定你没有制动任何东西。在Java中,默认情况下每个方法都是虚拟的(或者我错了?)