Skip to content

Commit

Permalink
Merge pull request #492 from trowski/spy-return-types
Browse files Browse the repository at this point in the history
Mock return types on spies
  • Loading branch information
davedevelopment committed Jul 27, 2015
2 parents 971dcdf + 947818b commit 612bde5
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 26 deletions.
26 changes: 1 addition & 25 deletions library/Mockery/Expectation.php
Expand Up @@ -217,31 +217,7 @@ protected function _getReturnValue(array $args)
return current($this->_returnQueue);
}

$rm = $this->_mock->mockery_getMethod($this->_name);
if ($rm && version_compare(PHP_VERSION, '7.0.0-dev') >= 0 && $rm->hasReturnType()) {
$type = (string) $rm->getReturnType();
switch ($type) {
case '': return;
case 'string': return '';
case 'int': return 0;
case 'float': return 0.0;
case 'bool': return false;
case 'array': return [];

case 'callable':
case 'Closure':
return function () {};

case 'Traversable':
case 'Generator':
// Remove eval() when minimum version >=5.5
$generator = eval('return function () { yield; };');
return $generator();

default:
return \Mockery::mock($type);
}
}
return $this->_mock->mockery_returnValueForMethod($this->_name);
}

/**
Expand Down
42 changes: 42 additions & 0 deletions library/Mockery/Mock.php
Expand Up @@ -617,6 +617,46 @@ public function mockery_getMethod($name)
return null;
}

/**
* @param string $name Method name.
*
* @return mixed Generated return value based on the declared return value of the named method.
*/
public function mockery_returnValueForMethod($name)
{
if (version_compare(PHP_VERSION, '7.0.0-dev') < 0) {
return;
}

$rm = $this->mockery_getMethod($name);
if (!$rm || !$rm->hasReturnType()) {
return;
}

$type = (string) $rm->getReturnType();
switch ($type) {
case '': return;
case 'string': return '';
case 'int': return 0;
case 'float': return 0.0;
case 'bool': return false;
case 'array': return [];

case 'callable':
case 'Closure':
return function () {};

case 'Traversable':
case 'Generator':
// Remove eval() when minimum version >=5.5
$generator = eval('return function () { yield; };');
return $generator();

default:
return \Mockery::mock($type);
}
}

public function shouldHaveReceived($method, $args = null)
{
$expectation = new \Mockery\VerificationExpectation($this, $method);
Expand Down Expand Up @@ -707,6 +747,8 @@ protected function _mockery_handleMethodCall($method, array $args)
if (\Mockery::getConfiguration()->mockingNonExistentMethodsAllowed() || (method_exists($this->_mockery_partial, $method) || is_callable("parent::$method"))) {
if ($this->_mockery_defaultReturnValue instanceof \Mockery\Undefined) {
return call_user_func_array(array($this->_mockery_defaultReturnValue, $method), $args);
} elseif (null === $this->_mockery_defaultReturnValue) {
return $this->mockery_returnValueForMethod($method);
} else {
return $this->_mockery_defaultReturnValue;
}
Expand Down
18 changes: 17 additions & 1 deletion tests/Mockery/MockingParameterAndReturnTypesTest.php
Expand Up @@ -50,7 +50,7 @@ public function testMockingIntegerReturnType()
$mock = $this->container->mock("test\Mockery\TestWithParameterAndReturnType");

$mock->shouldReceive("returnInteger");
$this->assertEquals(0, $mock->returnInteger());
$this->assertSame(0, $mock->returnInteger());
}

public function testMockingFloatReturnType()
Expand Down Expand Up @@ -108,6 +108,22 @@ public function testMockingParameterTypes()
$mock->shouldReceive("withScalarParameters");
$mock->withScalarParameters(1, 1.0, true, 'string');
}

public function testIgnoringMissingReturnsType()
{
$mock = $this->container->mock("test\Mockery\TestWithParameterAndReturnType");

$mock->shouldIgnoreMissing();

$this->assertSame('', $mock->returnString());
$this->assertSame(0, $mock->returnInteger());
$this->assertSame(0.0, $mock->returnFloat());
$this->assertSame(false, $mock->returnBoolean());
$this->assertSame([], $mock->returnArray());
$this->assertTrue(is_callable($mock->returnCallable()));
$this->assertInstanceOf("\Generator", $mock->returnGenerator());
$this->assertInstanceOf("test\Mockery\TestWithParameterAndReturnType", $mock->withClassReturnType());
}
}


Expand Down

0 comments on commit 612bde5

Please sign in to comment.