2011-11-24 164 views
5

使用默认的数据库,而不是测试,我在CakePHP中2测试模型,并嘲笑这样的模式:创建PHPUnit的嘲弄模型CakePHP的

$this->User = $this->getMock('User', array(
    '_saveUploadedFile', 
    '_removeUploadedFile', 
)); 
$this->User->expects($this->any()) 
     ->method('_saveUploadedFile') 
     ->with($data, Configure::read('App.myDirectory'), true); 
     ->will($this->returnValue(true)); 
$this->User->expects($this->any()) 
     ->method('_removeUploadedFile') 
     ->with($data, Configure::read('App.myDirectory')) 
     ->will($this->returnValue(true)); 

由于与数据库的任何操作引发以下错误:

"Database table mock__user_b6241a4cs for model User was not found." 

我重新定义了模型信息:

$this->User->alias = 'User'; 
$this->User->useTable = 'users'; 

现在的测试工作好吧,但它使用database.php中的$default数据库而不是$test。会发生什么?

为什么测试数据库配置在使用模拟对象时发生变化?它可能与数据库权限有关,导致模拟对象无法创建自定义表?

谢谢!

回答

2

我终于通过正确的参数传递给模型构造解决了这个问题在getMock()第三agument:

$this->User = $this->getMock('User', 
    array('_saveUploadedFile', '_removeUploadedFile'), 
    array(false, 'users', 'test') 
); 

应用是什么在Stubs section说PHPUnit文档中,第三个参数表示我想使用users表和test数据源。

我必须保持alias属性的重新定义,但:

$this->User->alias = 'User'; 

,因为一个简单的$this->User->read(null, 1)引发错误说'User.a_column'找不到。

感谢José Lorenzo

0

我以前没有遇到过这个特定的问题,但是我很好奇你是否尝试过设置你想要的特定连接。所以,以同样的方式设置aliasuseTable

$this->User->useDbConfig = 'test';