我正在掌握单元测试并学习如何将代码分解为可测试位,但我不清楚的一件事是如何编写我的'更高级'代码,例如我的控制器操作,以便测试控制器不需要通过实际数据层(在我的测试套件中的其他地方独立测试)。
例如 - 我有一个用户验证,它接受用户名/密码并验证他们的帐户并返回登录成功/失败:
class Api_AuthController extends Zend_Controller_Action
{
public function validateUserAction()
{
// extract, clean and validate $username from POSTed data
// extract, clean and validate $password from POSTed data
// access the data layer
$accountMapper = new Application_Model_Mapper_Account();
$accounts = $accountMapper(find(array('username' => $username, 'password' => $password));
if (count($accounts) == 1) {
// success
} else {
// failure
}
}
}
如前所述 - Application_Model_Mapper_Account
及其find()
方法已经在另一个单元测试中进行了测试,因此它是多余的(据我了解单元测试 - 不合需要,更不用说它会不必要地减慢我的测试速度)在这里再次测试,因为我真正需要测试的是该动作能够区分find函数的两个可能结果。
那么 - 如何将映射器和模型的模拟替换为此操作,以便限制validateUserAction测试的范围?
答案 0 :(得分:1)
我来自.net世界,但我们使用Inversion of Control containers to allow us to inject any dependencies进入控制器。通过这种方式,您可以模拟任何依赖项,以表现您的行为方式并将测试重点放在操作上。