2014-02-06 3 views
4

Я пытаюсь использовать свои первые функции с помощью Behat, и я столкнулся с проблемой, я не знаю, как реализовать ожидаемые исключения.Как реализовать ожидаемые исключения?

Я нашел проблему https://github.com/Behat/Behat/issues/140, и robocoder говорит об одном возможном способе, который также используется Бехатом. Но похоже, что они не справляются с исключениями.

Моя цель - добиться принудительной обработки исключений. Я не хочу, чтобы какая-либо конструкция ловила все исключения и забывала их.

Одним из возможных путей было бы:

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

Реализация

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

Мне не нравится описание сценария. Я хочу использовать ключевое слово , а затем.

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 
} 

Чтобы быть в состоянии проверить в method2 необходимо хранить исключение.
Единственный возможный способ, который я вижу, - использовать try/catch и сохранить его в переменной.
Кто-то другой поймает его и ничего не сделает с этим. Никто не заметит при проведении тестов.

Как я могу предотвратить исключение этих исключений?
Внедрил ли кто-нибудь другой подобный сценарий?

Спасибо за любые подсказки.

EDIT:

Behat контекст:

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

метод из класса сущностей:

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

    ... 
} 

ответ

0

Я думаю, что проблема в вашей реализации. Вы проверяете, успешна ли передача в «При переводах со своего счета»? Вам нужно проверить это?

тест

Failure:

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" 
+0

Как вы обрабатывать исключения, брошенные * переводов со своего счета * ? См. Вторую часть моего вопроса. – CSchulz

+0

он не должен бросать исключение, исключение должно быть выбрано в «Then i should ...». Можете ли вы опубликовать некоторую псевдо-реализацию? –

+0

Добавлена ​​некоторая реализация. Извините за поздний ответ. – CSchulz

2

Всегда пытаются поймать результат метода в поле класса контекста, например:

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

Теперь, когда ожидая исключения в следующий шаг просто проверьте, является ли $ this-> result экземпляром желаемого исключения с сообщением/кодом.

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); 
} 
Смежные вопросы