我正在尝试使用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();
}
...
}
答案 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);
}