我正在尝试测试方法是否在PHPSpec中引发异常。这是测试的方法;它要么运行Callable,要么运行控制器的动作。我试图测试最后的异常是否被抛出。
function dispatch($target, $params=array())
{
// call closure?
if( is_callable( $target ) ) {
call_user_func_array( $target, $params );
return true;
}
// call controller
list($controllerClass, $actionMethod) = explode('@', $target);
$controllerClass = $this->controllerNamespace . '\\' . $controllerClass;
if (!class_exists($controllerClass)) {
throw new \Exception('Controller not found: '.$controllerClass);
}
}
以下是PHPSpec测试案例:
function it_throws_an_exception_if_the_controller_class_isnt_callable()
{
$this->shouldThrow('\Exception')->duringDispatch('Nonexistentclass@Nonexistentmethod', array());
}
这与PHPSpec上的文档一致: http://www.phpspec.net/en/latest/cookbook/matchers.html#throw-matcher
问题是如果我评论throw new \ Exception行,这个测试仍然通过。它似乎根本不测试该方法。我做错了什么?
答案 0 :(得分:0)
创建一个新的异常类,将其放在dispatch()
而不是\Exception
中,并检查phpspec
是否抛出该异常。
从您描述的行为中我怀疑dispatch()
在到达\Exception
语句之前抛出if (! class_exists())
(如果自动加载器抛出异常,该行甚至可能是罪魁祸首)。
我将你的函数粘贴到我的项目类中(碰巧我现在正在使用phpspec
)并且在两种情况下规范都运行良好(抛出异常时和throw \Exception
时线被评论出来。)