CakePHP单元测试模拟控制器

时间:2012-02-04 22:12:00

标签: unit-testing cakephp phpunit

我正在尝试测试使用CakePHP Mock对象将值输入到会话组件中,但是我的测试仍然失败,说明还没有调用write方法。我调试了这个,并且知道该方法已被调用,所以不确定我做错了什么。

以下是单元测试中的代码:

$this->controller = $this->generate('Posts', array(
    'components' => array(
    'Session' => array('write')
)));

$this->testAction(...);

$this->controller->Session
    ->expects($this->any())
    ->method('write')
    ->with('my value here');

我收到以下错误:

  

方法名称的期望失败等于调用零次或多次时。   模拟方法不存在。

如果我将呼叫更改为期望为 - >预期($ this-> once()),则会出现此错误:

  

方法名称的期望失败等于1次调用时。   预计方法被调用1次,实际上被称为0次。

我在$ this-> Controller上做了一个var_dump,肯定有一个模拟的会话对象,它似乎注意到对'write'方法的调用,所以我真的不知道为什么我是收到错误消息。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

模拟设置代码应该在调用$this->testAction()之前,如:

$this->controller = $this->generate('Posts', array(
    'components' => array(
    'Session' => array('write')
)));

//Add the method mock details here
$this->controller->Session
    ->expects($this->any())
    ->method('write')
    ->with('my value here');

//Then call testAction
$this->testAction(...);

这应该可以解决你的问题。