I want test an example method with scalar type hinting and strict types in PHP7. When I don't pass an argument, the method should throw a TypeError
. PHPSpec return fatal error:
Uncaught TypeError: Argument 1 passed to Example::test
<?php
class Example
{
public function test(string $name)
{
$this->name = $name;
}
}
class ExampleSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Test\Example');
}
function it_check_test_method_when_not_pass_argument()
{
$this->shouldThrow('\TypeError')->during('test');
}
}
At the beginning I declare: declare(strict_types=1);
What is wrong? How do I test throwing TypeError
?
For me it works if I annotate the unit test with this:
/**
* @expectedException \TypeError
*/
Then my test is green.
Upon further investigation, this is a PHPSpec bug, and has been reported here. The bug hasn't been fixed in several months, so I would suggest commenting on it.
If you look at the code in src/PhpSpec/Matcher/ThrowMatcher.php
, you can see that PHPSpec catches Exceptions that inherit 'Exception
' and then checks the instance type of that exception. But, TypeError
doesn't inherit from Exception
, it inherits from Error
. The only thing it has in common with an Exception
, is that they both implement the Throwable
interface.
For example:
101 public function verifyPositive($callable, array $arguments, $exception = null)
102 {
103 try {
104 call_user_func_array($callable, $arguments);
105 } catch (\Exception $e) {
106 if (null === $exception) {
107 return;
108 }
109
110 if (!$e instanceof $exception) {
111 throw new FailureException(sprintf(
112 'Expected exception of class %s, but got %s.',
113 $this->presenter->presentValue($exception),
114 $this->presenter->presentValue($e)
115 ));
116 }
Report the bug, explain these details, and show them this documentation about the inheritance of TypeError
.
来源:https://stackoverflow.com/questions/34568723/phpspec-catching-typeerror-in-php7