Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP模拟模型动态加载到控制器中_Cakephp_Mocking_Phpunit - Fatal编程技术网

CakePHP模拟模型动态加载到控制器中

CakePHP模拟模型动态加载到控制器中,cakephp,mocking,phpunit,Cakephp,Mocking,Phpunit,我正在为我的控制器编写一些单元测试,在控制器中模拟模型时遇到了一些问题 一些代码: class ExampleController extends AppController { public function some() { $this->loadModel('ModelA'); $this->loadModel('ModelB'); //this I want to mock $modelAVal

我正在为我的控制器编写一些单元测试,在控制器中模拟模型时遇到了一些问题

一些代码:

class ExampleController extends AppController {
    public function some()
    {
        $this->loadModel('ModelA');
        $this->loadModel('ModelB');
        //this I want to mock
        $modelAVal = $this->ModelA->someFunctionFromModel($param);
        $modelBVal = $this->ModelB->ModelCDependentFromModelB->someFunction($param);
    }
}
在我的controllertestcase中,我尝试使用以下代码:

public function testSome() {
    $mock = $this->generate('Example', [
        'models' => ['ModelA', 'ModelB', 'ModelC']
    ]);
    $mock->ModelA->expects($this->once())->method('someFunctionFromModel')->will($this->returnValue(true));
    $mock->ModelB->ModelC->expects($this->once())->method('someFunction')->will($this->returnValue(true));
}

错误:调用非对象上的成员函数expects()-对于我尝试使用的每个模型…

这是一篇旧文章,但我遇到了相同的问题

我是这样解决的:

public function testSome() {
    // mock your controller
    $mock = $this->generate(
        'Example',
        array(
         models' => array('ModelA'),
        )
    );
    // mock modelA and assign it to the mocked controller model
    $mock->ModelA = $this->getMockForModel('ModelA', array('someFunction'));
    $mock->ModelA
        ->expects($this->once())
        ->method('someFunction')
        ->will($this->returnValue('yeah'));
}
这只适用于直接相关的模型,而不是模拟已模拟模型的模型,我不确定这是一个好主意