【问题标题】:CakePHP Mocking models loaded on fly in controllerCakePHP 模拟模型在控制器中动态加载
【发布时间】:2014-04-22 12:53:04
【问题描述】:

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

一些代码:

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

在我的控制器测试用例中,我尝试使用以下代码:

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() - 对于我尝试使用的每个模型...

【问题讨论】:

    标签: cakephp mocking phpunit


    【解决方案1】:

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

    我是这样解决的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多