Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00%
0 / 1
0.00%
0 / 11
CRAP
0.00%
0 / 101
Stub
0.00%
0 / 1
0.00%
0 / 11
420
0.00%
0 / 101
 make($class, $params = array()
0.00%
0 / 1
30
0.00%
0 / 22
 anonymous function ($m)
0.00%
0 / 1
2
0.00%
0 / 1
 factory($class, $num = 1, $params = array()
0.00%
0 / 1
6
0.00%
0 / 6
 makeEmptyExcept($class, $method, $params = array()
0.00%
0 / 1
2
0.00%
0 / 9
 makeEmpty($class, $params = array()
0.00%
0 / 1
2
0.00%
0 / 7
 copy($obj, $params = array()
0.00%
0 / 1
2
0.00%
0 / 6
 construct($class, $constructorParams = array()
0.00%
0 / 1
6
0.00%
0 / 12
 constructEmpty($class, $constructorParams = array()
0.00%
0 / 1
2
0.00%
0 / 7
 constructEmptyExcept($class, $method, $constructorParams = array()
0.00%
0 / 1
2
0.00%
0 / 4
 update($mock, array $params)
0.00%
0 / 1
6
0.00%
0 / 6
 bindParameters($mock, $params)
0.00%
0 / 1
12
0.00%
0 / 16
<?php
namespace Codeception\Util;
class Stub
{
public static function make($class, $params = array())
{
if (!class_exists($class)) throw new \RuntimeException("Stubbed class $class doesn't exist.");
$reflection = new \ReflectionClass($class);
$callables = array_filter($params, function ($a) { return is_callable($a); });
if (!empty($callables)) {
if ($reflection->isAbstract()) {
$mock = \PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass($class, array_keys($callables), '', false);
} else {
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, array_keys($callables), array(), '', false);
}
} else {
if ($reflection->isAbstract()) {
$mock = \PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass($class, array(), '', false);
} else {
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, null, array(), '', false);
}
}
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function factory($class, $num = 1, $params = array())
{
$objs = array();
for ($i = 0; $i < $num; $i++) $objs[] = self::make($class, $params);
return $objs;
}
public static function makeEmptyExcept($class, $method, $params = array()) {
$reflectionClass = new \ReflectionClass($class);
$methods = $reflectionClass->getMethods();
$methods = array_filter($methods, function ($m) use ($method) { return $method != $m->name; });
$methods = array_map(function ($m) { return $m->name; }, $methods);
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, $methods, array(), '', false);
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function makeEmpty($class, $params = array())
{
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, array(), array(), '', false);
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function copy($obj, $params = array())
{
$copy = clone($obj);
self::bindParameters($copy, $params);
return $copy;
}
public static function construct($class, $constructorParams = array(), $params = array())
{
$callables = array_filter($params, function ($a) { return is_callable($a); });
if (!empty($callables)) {
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, array_keys($callables), $constructorParams);
} else {
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, null, $constructorParams);
}
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function constructEmpty($class, $constructorParams = array(), $params = array())
{
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, array(), $constructorParams);
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function constructEmptyExcept($class, $method, $constructorParams = array(), $params = array())
{
$reflectionClass = new \ReflectionClass($class);
$methods = $reflectionClass->getMethods();
$methods = array_filter($methods, function ($m) use ($method) { return $method != $m->name; });
$methods = array_map(function ($m) { return $m->name; }, $methods);
$mock = \PHPUnit_Framework_MockObject_Generator::getMock($class, $methods, $constructorParams);
self::bindParameters($mock, $params);
$mock->__mocked = $class;
return $mock;
}
public static function update($mock, array $params)
{
if (!$mock->__mocked) throw new \LogicException('You can update only stubbed objects');
self::bindParameters($mock, $params);
return $mock;
}
protected static function bindParameters($mock, $params)
{
$reflectionClass = new \ReflectionClass($mock);
foreach ($params as $param => $value) {
if (!($value instanceof \Closure)) {
$reflectionProperty = $reflectionClass->getProperty($param);
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($mock, $value);
continue;
}
$mock->
expects(new \PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount)->
method($param)->
will(new \PHPUnit_Framework_MockObject_Stub_ReturnCallback($value));
}
}
}