创建PHPUnit模拟模型使用默认数据库而不是CakePHP中的test

eli*_*lon 5 php phpunit unit-testing cakephp mocking

我在CakePHP 2中测试一个模型并且模拟了这样的模型:

$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));
Run Code Online (Sandbox Code Playgroud)

由于使用数据库的任何操作都会引发以下错误:

"Database table mock__user_b6241a4cs for model User was not found."
Run Code Online (Sandbox Code Playgroud)

我重新定义了模型信息:

$this->User->alias = 'User';
$this->User->useTable = 'users';
Run Code Online (Sandbox Code Playgroud)

现在测试运行良好,但它使用的是$default数据库,database.php而不是$test.可能发生什么?

使用模拟对象时,为什么测试的数据库配置会发生变化?是否与数据库权限相关,导致模拟对象无法创建自定义表?

谢谢!

eli*_*lon 2

我最终通过将正确的参数传递给第三个参数中的模型构造函数解决了问题getMock()

\n\n
$this->User = $this->getMock(\'User\',\n  array(\'_saveUploadedFile\', \'_removeUploadedFile\'),\n  array(false, \'users\', \'test\')\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用 PHPUnit 文档的存根部分中的内容,第三个参数表明我想使用users表和test数据源。

\n\n

但我必须保留该alias属性的重新定义:

\n\n
$this->User->alias = \'User\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为简单的$this->User->read(null, 1)会引发错误,指出\'User.a_column\'无法找到。

\n\n

感谢乔斯\xc3\xa9 洛伦佐

\n