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

时间:2015-05-23 21:12:10

标签: phpspec

我正在尝试测试方法是否在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行,这个测试仍然通过。它似乎根本不测试该方法。我做错了什么?

1 个答案:

答案 0 :(得分:0)

创建一个新的异常类,将其放在dispatch()而不是\Exception中,并检查phpspec是否抛出该异常。

从您描述的行为中我怀疑dispatch()在到达\Exception语句之前抛出if (! class_exists())(如果自动加载器抛出异常,该行甚至可能是罪魁祸首)。

我将你的函数粘贴到我的项目类中(碰巧我现在正在使用phpspec)并且在两种情况下规范都运行良好(抛出异常时和throw \Exception时线被评论出来。)