考虑这样的事情:
class UsersTable
{
public function findUserById($id)
{
$sql = "...";
return $this->adapter->execute($sql);
}
}
整个类几乎都不是包装SQL语句的方法,并且实际上没有复杂的逻辑。我基本上是在测试SQL本身。
我知道攻击数据库的测试通常是集成测试,但这仍然是一个集成测试,因为它是直接测试的,因为单元测试会是?
答案 0 :(得分:0)
我想说,因为你的测试不仅仅是那个特定单元的逻辑(findUserById),它还是一个集成测试。如果你想进行正确的单元测试,我会研究模拟对象和依赖注入。因为看起来你正在使用PHP,我猜你可能正在使用phpUnit进行单元测试,而phpUnit允许进行模拟。要对此函数进行单元测试,您可能希望模拟适配器成员的execute方法,并断言使用正确的$ sql字符串调用它一次。出于这些目的,我想你应该假设execute方法正常工作,所以不需要测试它。 Here是phpUnit的链接,描述了它们的对象模拟。
答案 1 :(得分:0)
我发现这些集成测试非常有用,并且很好地补充了您的纯单元测试。它们可以很好地指示您的数据库已正确连接并与您的对象模型兼容。 当我包含这些类型的测试时,我不倾向于模拟数据库,因为我可以轻松地在集成测试中进行所有测试。 但我建议将您正在测试的数据添加为测试的前提条件。
我基本上遵循这种模式:
1)将用户添加到DataBase 2)在这里调用您的测试方法 3)断言您检索到的用户与刚刚创建的用户相同。
使用此模式,您不必依赖db中可能随时间变化的现有数据,并使测试变得脆弱。