added support for setExpectedException()

This commit is contained in:
tmont 2009-07-02 16:58:17 +00:00
parent 64a5702a48
commit 2341bf20ea
2 changed files with 67 additions and 9 deletions

View File

@ -187,7 +187,7 @@
$method->getDeclaringClass()->getName() !== __CLASS__ &&
preg_match('/^[\/\*\s]*@test\s*(?:\*\/)?$/m', $method->getDocComment())
) {
$methods[] = new TestMethod(Util::getClosure($this, $method->getName()), get_class($this) . '::' . $method->getName(), $this->getAutoVerify());
$methods[$method->getName()] = new TestMethod(Util::getClosure($this, $method->getName()), get_class($this) . '::' . $method->getName(), $this->getAutoVerify());
}
}
@ -222,6 +222,30 @@
return $creator->generate($args, $name);
}
/**
* Sets the exception that is expected to be thrown in this method
*
* @author Tommy Montgomery
* @version 1.0
* @since 1.0
*
* @param string $exceptionName The name of the exception that is expected to be thrown
* @throws InvalidArgumentException
*/
protected function setExpectedException($exceptionName) {
if (!is_string($exceptionName)) {
throw new InvalidArgumentException('1st argument must be a string');
}
//get name of calling method
$trace = debug_backtrace();
$method = $trace[1]['function'];
unset($trace);
$methods = $this->getTestableMethods();
$methods[$method]->setExpectedException($exceptionName);
}
/**
* Wrapper for interacting with the mock object framework
*

View File

@ -38,6 +38,13 @@
*/
protected $name;
/**
* Name of the expected exception
*
* @string
*/
protected $expectedException;
/**
* Constructor
*
@ -50,9 +57,10 @@
* @param bool $autoVerify
*/
public function __construct($closure, $name, $autoVerify) {
$this->closure = $closure;
$this->autoVerify = (bool)$autoVerify;
$this->name = $name;
$this->closure = $closure;
$this->autoVerify = (bool)$autoVerify;
$this->name = $name;
$this->expectedException = null;
}
/**
@ -68,6 +76,19 @@
return $this->name;
}
/**
* Sets the expected exception
*
* @author Tommy Montgomery
* @version 1.0
* @since 1.0
*
* @param string $exceptionName Name of the exception that is expected to be thrown
*/
public final function setExpectedException($exceptionName) {
$this->expectedException = $exceptionName;
}
/**
* Runs the test
*
@ -107,18 +128,31 @@
}
}
if ($this->expectedException !== null) {
//expected exception was never thrown
throw new FailedTest('Expected exception "' . $this->expectedException . '" to be thrown');
}
foreach ($listeners as $listener) {
$listener->onTestMethodPassed($this);
}
} catch (TestFailure $failure) {
$this->handleTestFailure($failure, $listeners);
} catch (Exception $e) {
//test for expected exception
foreach ($listeners as $listener) {
$listener->onTestMethodErred($this);
if ($this->expectedException !== null) {
if ($e instanceof $this->expectedException) {
//we expected this exception
foreach ($listeners as $listener) {
$listener->onTestMethodPassed($this);
}
}
} else {
foreach ($listeners as $listener) {
$listener->onTestMethodErred($this);
}
$failure = new ErredTest($e->getMessage(), $e);
}
$failure = new ErredTest($e->getMessage(), $e);
}
$result = $this->createTestResult($failure);