如何实现预期的例外?

时间:2014-02-06 14:35:32

标签: exception-handling behat

我正在尝试使用Behat的第一个功能,我正面临着我不知道如何实现预期异常的问题。

我发现问题https://github.com/Behat/Behat/issues/140和robocoder正在谈论一种可能的方式,Behat也使用它。但似乎他们并没有真正处理异常。

我的观点是实现强制异常处理。我不希望任何构造捕获所有异常并忘记它们。

一种可能的方式是:

When <player> transfers <transfer> from his account it should fail with <error>

实施

try {
    ...
} catch (\Exception $ex) {
    assertEquals($error, $ex->getMessage());
}

我不喜欢场景描述。我想使用 then 关键字,例如

When <player> transfers <transfer> from his account
Then it should fail with error <error>

这个描述的缺点是我需要两种方法:

method1($arg1, $arg2) {
    // Test the transfer
}

method2($arg1, $arg2) {
    // Check if the exception is the right one
}

为了能够检入方法2 ,需要存储异常 我看到的唯一可能的方法是使用try / catch并将其存储到变量中 别人会抓住它而不采取任何措施。在运行测试时,没有人会注意到。

如何防止异常被丢弃?
是否有其他人实施了类似的方案?

感谢任何提示。

修改

Behat context:

playerTransfer($player, $amount) {      
    $player->transfer($amount);
}

来自实体类的方法:

transfer($amount) {
    if ($this->getWealth() < $amount) {
        throw NotEnoughMoney();
    }

    ...
}

3 个答案:

答案 0 :(得分:2)

始终尝试将方法结果捕获到上下文类字段,例如:

//inside Behat context class method  
try {
  $this->outcome = $func();
}
catch(\Exception $ex) {
  $this->outcome = $ex;
}

现在,当下一步期待异常时,只需检查$ this-&gt;结果是否是带有消息/代码的所需异常的实例。

答案 1 :(得分:0)

我认为问题出在您的实施中。您是否在“从他的帐户转帐时”检查转帐是否成功?你需要检查一下吗?

失败测试:

When <player> transfers <transfer> from his account
Then I should see error <error>

成功的一步:

When <player> transfers <transfer> from his account
Then I should see "transfer successful"

答案 2 :(得分:0)

在这里,我是如何在我的一个项目中成功完成的,我必须重复几个步骤,直到条件成立:

/**
* @Given /^I execute some conditions$/
*/
public function executeConditions()
{
   $flag = 1;
    do {
        try {
            <steps to be executed till the condition holds true>
            $flag=1;
        } catch (\Exception $ex) {
            $flag = 0;
        }
    }while ($flag>0);
 }