为什么PHPSpec不能使用::shouldThrow()测试抛出的异常?



我正在尝试测试一个方法是否在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行被注释掉时)。

相关内容

  • 没有找到相关文章

最新更新