CakePHP模拟模型在控制器中加载

时间:2014-03-17 10:46:56

标签: cakephp mocking phpunit

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

一些代码:

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));
}

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

1 个答案:

答案 0 :(得分:0)

这是一个老帖子,但我只是遇到了同样的问题。

我这样解决了:

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'));
}

这仅适用于直接相关的模型,而不适用于模拟模型的模拟模型,我不确定这是一个好主意。

相关问题