Allow datasource access in constructors of mocked models.

When mock objects are created from models that access their datasource
in the constructor, an exception would be raised for the missing default
datasource. By changing how configuration data is handled in the mock
creation we can avoid this issue and not reopen #4867

Refs #8225
This commit is contained in:
mark_story 2016-09-12 22:15:22 -04:00
parent d0041f155d
commit 9d1fbb95b3
2 changed files with 29 additions and 3 deletions

View file

@ -39,6 +39,22 @@ class SecondaryPost extends Model {
}
/**
* ConstructorPost test stub.
*/
class ConstructorPost extends Model {
/**
* @var string
*/
public $useTable = 'posts';
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->getDataSource()->cacheMethods = false;
}
}
/**
* CakeTestCaseTest
*
@ -435,6 +451,16 @@ class CakeTestCaseTest extends CakeTestCase {
ConnectionManager::drop('test_secondary');
}
/**
* Test getMockForModel when the model accesses the datasource in the constructor.
*
* @return void
*/
public function testGetMockForModelConstructorDatasource() {
$post = $this->getMockForModel('ConstructorPost', array('save'), array('ds' => 'test'));
$this->assertEquals('test', $post->useDbConfig);
}
/**
* test getMockForModel() with plugin models
*

View file

@ -718,13 +718,13 @@ abstract class CakeTestCase extends PHPUnit_Framework_TestCase {
* @return Model
*/
public function getMockForModel($model, $methods = array(), $config = array()) {
$config += ClassRegistry::config('Model');
$defaults = ClassRegistry::config('Model');
unset($defaults['ds']);
list($plugin, $name) = pluginSplit($model, true);
App::uses($name, $plugin . 'Model');
$config = array_merge((array)$config, array('name' => $name));
unset($config['ds']);
$config = array_merge($defaults, (array)$config, array('name' => $name));
if (!class_exists($name)) {
throw new MissingModelException(array($model));