我正在尝试测试一个方法是否在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行,这个测试仍然通过。它似乎根本没有测试这个方法。我做错了什么?
创建一个新的异常类,将其抛出dispatch()
而不是Exception
,如果该异常被抛出,则检查phpspec
。
根据您描述的行为,我怀疑dispatch()
在到达if (! class_exists())
语句之前抛出Exception
(如果自动加载器抛出异常,甚至那行也可能是罪魁祸首)。
我把你的函数粘贴到我的项目的一个类中(它发生了,我现在正在使用phpspec
),规范在两种情况下都工作得很完美(当抛出异常时,当throw Exception
行被注释掉时)。