我有以下方法:
public void ImportDataCommand()
{
// some data validation logic here
if (some_criteria_is_true)
{
// Call to a method which uses sql queries to update some records
UpdateRecords();
}
else
{
// Call to a method which uses sql queries to delete some records
DeleteRecords();
}
}
UpdateRecords()
和DeleteRecords()
进行单元测试? (如果可能的话)非常感谢这方面的任何帮助。如果您需要更多信息或有些不明确的地方,请告诉我。
更新
我对这里嘲笑数据源不感兴趣。我想确定我的sql查询是否正确并且正在进行正确的更新。很抱歉这个混乱,如果您认为,我想测试我的验证逻辑而不是我的数据更新逻辑(sql)。
我确实有使用模拟框架的经验,并且我确实成功地使用它们为我的正常应用程序逻辑编写单元测试。
答案 0 :(得分:3)
您的问题始于短语'以及'。
在同一个类中没有验证和数据访问权限 - 将数据访问委托给另一个类并注入它 - 这样您就可以在测试验证时模拟数据源。
class Bar {
private DataAccessService service
public void Foo()
{
// some data validation logic here
if (some_criteria_is_true)
{
// Call to a method which uses sql queries to update some records
service.updateBarRecords();
}
else
{
// Call to a method which uses sql queries to delete some records
service.deleteBarRecords();
}
}
}
然后,您可以使用模拟框架来测试是否调用了正确的服务方法。
答案 1 :(得分:0)
这取决于您的应用程序的整个架构和公司的IT / DB基础架构,以及您可以在中型或大型公司中强制执行的数据策略。
过去人们曾经有一个SQLite实例用于单元测试,或者你可以使用相同的技术,例如SQL Server,但是有单元测试来连接到开发或QA数据库服务器,肯定不是生产。
我过去做过的一件事就是在命令执行时进行事务处理,并在单元测试中回滚事务,因此DEV / QA数据库中没有任何内容,但是命令执行的测试是无论如何都要表现。
答案 2 :(得分:0)
当您进行单元测试时,您特别只关注该单元,即此处的方法。因此,当您编写测试用例时,您可以模拟通常通过依赖注入调用的其他方法(如果它是API调用或某些东西)。其他方面,你只是猜测和编写测试用例的方法。
因此,在您的代码案例中,您可以单独为Foo(),UpdateBarRecords()和DeleteBarRecords()编写测试用例。
忽略所有方法调用(对其进行单元测试),并专注于您在该方法中编写的核心逻辑代码,并将其集中用于单元测试。
答案 3 :(得分:0)
恕我直言,你应该在你的代码中解决这个问题:
由于Foo的命名不是自我解释,因此没有其他内容,但如果您可以详细说明方法的上下文,我们可以添加更多备注。