【发布时间】:2012-01-04 04:53:29
【问题描述】:
使用 PHPUnit 3.6 我正在尝试在下面的控制器类中测试 exec() 方法。这个方法做了两件事:
- 根据对象的现有属性确定要调用的方法的名称,并且...
- 如果确定的控制器方法可调用,则执行该方法,否则该方法将引发异常
(简化的)源代码如下所示:
abstract class CLIController extends Controller
{
/* irrelevant class details here */
public function exec()
{
$action = ! empty($this->opts->args[0])
? $this->opts->args[0]
: $this->default_action;
if ( ! $action || ! is_callable(array($this, $action))) {
$msg = 'Invalid controller action specified';
throw new LogicException($msg);
} else {
$this->$action(); // <---- trying to get code coverage on this line!
}
}
}
所以我的问题是...
我不知道如何覆盖这部分代码:
} else {
$this->$action();
}
因为我不确定如何(或者甚至可能)测试在抽象类的上下文中名称未知的方法的调用。 再次声明:要调用的方法在子类中声明。 通常我会模拟一个抽象方法,但在这种情况下我不能,因为该方法还不存在——它将被指定由一个子类。
答案可能是什么...
- ???可能甚至不需要覆盖这一行,因为它本质上依赖于 PHP 正确调用可调用类方法的能力。如果我成功测试
exec()在应该抛出异常时抛出异常,我知道相关行的正确运行取决于 PHP 是否正常运行。这是否会使首先对其进行测试的需要无效??? - 如果有某种方法可以模拟抽象类并创建一个具有已知名称的方法以添加到模拟类,这将解决我的问题,这也是我一直在尝试但没有成功的方法到目前为止。
- 我知道我可以创建一个具有已知方法名称的子类,但我认为创建一个具体的子类只是为了测试一个抽象父类并不是一个好主意。
- 可能是我需要重构。我不想做的一件事是让子类自己实现
exec()函数。
我尝试过的...
- 使用 PHP 的某些反射功能无济于事 - 这可能是由于我自己对反射缺乏经验,而不是它无法处理这种情况。
- 反复阅读 PHPUnit 手册和 API 文档。不幸的是,尽管 PHPUnit 很棒,但我经常发现 API 文档有点简单。
对于如何在此处进行最佳操作的任何指导,我将不胜感激。提前致谢。
【问题讨论】:
标签: php unit-testing phpunit