在Codeception Functional Cept中设置预期的异常

Mar*_*tin 4 php phpunit laravel laravel-4 codeception

我想做的事情如下:

$I->setExpectedException('Laracasts\Validation\FormValidationException');
Run Code Online (Sandbox Code Playgroud)

在一个功能性的cept.有机会吗?

\PHPUnit_Framework_TestCase::setExpectedException('Laracasts\Validation\FormValidationException');
Run Code Online (Sandbox Code Playgroud)

上面的代码将单独工作,但如果我运行codecept run,一旦完成预期异常的测试,测试就会卡住.

这是我的设置:

阳明:

class_name: FunctionalTester
modules:
    enabled: [Filesystem, Db, FunctionalHelper, Laravel4, Asserts]
Run Code Online (Sandbox Code Playgroud)

小智 11

我认为这是Laravel 4模块的一个已知问题,用于代码检测,不确定它是否会很快修复,但同时我创建了一个辅助函数来测试异常:

在文件tests/_support/FunctionalHelper.php中添加以下方法:

public function seeExceptionThrown($exception, $function)
{
    try
    {
        $function();
        return false;
    } catch (Exception $e) {
        if( get_class($e) == $exception ){
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

你在Cepts中使用它像这样:

$I = new FunctionalTester($scenario);
$I->assertTrue(
    $I->seeExceptionThrown('Laracasts\Validation\FormValidationException', function() use ($I){
    //All actions that you expect to generate the Exception
    $I->amOnPage('/users/edit/1');
    $I->fillField('name', '');
    $I->click('Update');
}));
Run Code Online (Sandbox Code Playgroud)

  • 当我意识到`Exception`没有全局引用时,我花了30多分钟搞清楚为什么它对我不起作用所以我不得不将`catch(Exception $ e)`更改为`catch(\ Exception $ e) ` - 我希望有一天能帮助某人...... (5认同)