Как тестировать код, который поднимает исключение

slego

Новичок
Как тестировать код, который поднимает исключение

Есть класс-валидатор
PHP:
/**
 * Validate for integer value
 *
 * @author Safronov Oleg ([email protected])
 * @version 1.0.0
 */
class IntValidator extends Validator
{
    /**
     * @param int Value for checking
     * @return bool true If validation is passed, otherwise
     *              the exception is thrown
     * @throws <b>ValidatorException</b> If validation failes
     */
    public function validate($val)
    {
        if (!is_int($val)) 
        {
            throw new ValidatorException(Message::get("err_invalid_int"));
        }
        return true;
    }
}; 

try
{
      $vld = new IntValidator();
      $vld->validate("--");
}
catch(ValidatorException $ve)
{
       $ve->getXMessage();  // trace: параметр должен быть целочисленным
}
Вооот. И как теперь такое можно оттестировать?
Для случая, когда проверка должна быть пройдена, вроде как без проблем:
PHP:
class IntValidatorTest extends UnitTestCase
{
	private $_vld = null;
	public function setUp()
	{
		$this->_vld = new IntValidator();
	}
	
	public function testPass()
	{
		$val = 0;
		$this->assertTrue($this->_vld->isValid($val));
		$val = -1;
		$this->assertTrue($this->_vld->isValid($val));
		$val = 555;
		$this->assertTrue($this->_vld->isValid($val));
	}	
}
//1/1 test cases complete: 3 passes, 0 fails and 0 exceptions.
А как теперь быть с той частью, где exception'ы поднимаются? Есть assertError(...). Попробовал - не то. Нужно что-то типа assertException(...), насколько я понимаю.
Или до версии simpletest 2.0 без шансов?

И еще по ходу, люди, намекните, пожалуйста, ДЛЯ ЧЕГО нужны mock-объекты, их смысл и философию. Если можно - на пальцах. Сколько читал, смотрел тесты, так и не понял :(
 

syfisher

TDD infected!!
Кратенько - вот так мы тестируем это хозяйство в Limb:

PHP:
  function testSaveException()
  {
    $object_to_test = new ObjectToTest();
    try
    {
      $object_to_test->doSomethingToThrowAnException();
      $this->assertTrue(false);
    }
    catch(LimbException $e){}
  }
Если exception-а не будет, будет fail.

Плюс можно протестировать сообщение, если это важно.

-~{}~ 15.09.05 13:58:

Автор оригинала: slego
И еще по ходу, люди, намекните, пожалуйста, ДЛЯ ЧЕГО нужны mock-объекты, их смысл и философию. Если можно - на пальцах. Сколько читал, смотрел тесты, так и не понял :(
Тебе на русском, али можно на буржуйском ссылки дать?
 

slego

Новичок
Автор оригинала: syfisher
Кратенько - вот так мы тестируем это хозяйство в Limb:

PHP:
  function testSaveException()
  {
    $object_to_test = new ObjectToTest();
    try
    {
      $object_to_test->doSomethingToThrowAnException();
      $this->assertTrue(false);
    }
    catch(LimbException $e){}
  }
Если exception-а не будет, будет fail.
Хм... хитро... сам бы, наверное, еще не скоро догадался.
Тебе на русском, али можно на буржуйском ссылки дать?
Да, собственно, все равно. Только... читал я уже... много... но пока так и не понял. Т.е. предложения и слова (ну и буквы) понимаю, а общий смысл уловить не могу... саму концепцию...
Или на пальцах - не получится? Ну я не знаю, метафорой какой-нибудь.. мне бы зацепиться только...

Спасибо огромное
 

syfisher

TDD infected!!
slego - у тебя же там ForJest рядом живет! Вам нужно срочно скорешиться! Он даже меня порой удивляет свои рвением насчет TDD.

Итак, насчет моков. Я не хочу писать в эту тему. Если у тебя будет много вопросов - заведи еще одну. Типа "Что такое моки и как правильно их использовать".

Я надеюсь ты прочитал вот эти документы:
http://phpclub.ru/faq/wakka.php?wakka=Mocks&v=aoq

http://phpclub.ru/faq/wakka.php?wakka=MocksInjection&v=12ih

Рекомендую еще Junit in Action, если с англ. все в порядке.

Для понимания роли моков нужно иметь опыт применения интерфейсов, хорошо понимать, что такое зависимости и как их можно уменьшать.

Почитай книгу Роберта Мартина "Быстрая разработка программ". Раз уж вступил на путь TDD - это для тебя must read. В этой книге есть все, что нужно, чтобы понять, зачем нужны интерфейсы, моки, тесты и все, что связано с Agile Development-ом.

Ну и не стесняйся задавать вопросы.
 

slego

Новичок
Ок. Уболтал. Возможно немного по-позже и заведу такую темку. Когда станет чуть-чуть понятней.
Ну и За ForJest'a спасибо, что подсказал.

А я и не стесняюсь :). Тему в форуме подымаю, если уже совсем тупиковая ситуация и поиски в инете ничего не дали.
 
Сверху