php 在编译功能概念中设置预期异常

pqwbnv8z  于 2022-12-10  发布在  PHP
关注(0)|答案(3)|浏览(260)

我想做的事情如下:

$I->setExpectedException('Laracasts\Validation\FormValidationException');

在一个功能性的概念。有机会这样做吗?

\PHPUnit_Framework_TestCase::setExpectedException('Laracasts\Validation\FormValidationException');

上面的代码可以独立工作,但是如果我运行codecept run,一旦带有预期异常的测试完成,测试就会卡住。
我的设置如下:
YML:

class_name: FunctionalTester
modules:
    enabled: [Filesystem, Db, FunctionalHelper, Laravel4, Asserts]
gupuwyp2

gupuwyp21#

我认为这是一个known problem与Laravel 4模块的codecrement,不确定是否会很快修复,但在此期间,我创建了一个帮助函数来测试异常:
在文件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;
    }
}

你可以在你的 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');
}));
lfapxunr

lfapxunr2#

我对Mind的解决方案进行了一些扩展:

public function seeException($callback, $exception = 'Exception', $message = '')
  {
    $function = function () use ($callback, $exception) {
      try {
        $callback();
        return false;
      }
      catch (Exception $e) {
        if (get_class($e) == $exception or get_parent_class($e) == $exception) {
          return true;
        }
        return false;
      }
    };
    $this->assertTrue($function(), $message);
  }

在您的概念中,您可以

$I->seeException('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');
})

这样在异常测试方法之外就不需要assertTrue了。如果你也知道抛出了异常,你也可以省略第二个参数。最后你可以把一个消息字符串作为第三个参数。这样你就可以在错误失败时使错误更有表现力。

EDIT对不起,我忽略了一件事。在FunctionalHelper.php中,你必须扩展parents _beforeSuite方法:

public function _beforeSuite()
  {
    parent::_beforeSuite();
    $this->assert = $this->getModule('Asserts');

  }

EDIT2刚发现如果你隐式Assert抛出了一个异常,并且php的原生异常不是出现的父异常,那么test方法就不起作用,因为该方法只检查第一和第二异常级别。要使该方法检查整个expection堆栈,你必须使用此方法

public function assertThrows($callback, $exception = 'Exception', $message = '')
  {
    $function = function () use ($callback, $exception) {
      $getAncestors = function($e) {

        for ($classes[] = $e; $e = get_parent_class ($e); $classes[] = $e);
        return $classes;

      }

      try {
        $callback();
        return false;
      }
      catch (Exception $e) {
        if (get_class($e) == $exception or in_array($e, $getAncestors($e))) {
          return true;
        }
        return false;
      }
    };
    $this->assertTrue($function(), $message);
  }
vkc1a9a2

vkc1a9a23#

另一种方法:

// prev steps

try {
    $model->methodWichThrowsException();
    throw new \RuntimeException('Must throw ExpectedException');
} catch (\ExpectedException $e) {
    
}

// next steps

相关问题