模拟对象中的CakePHP“with”方法不起作用

时间:2012-06-20 00:40:07

标签: cakephp authentication mocking phpunit

我正在尝试使用CakePHP 2.2 RC1测试我的应用程序,在我的控制器的某个操作中我需要一个Auth对象的信息,在我的测试中我已经为Auth组件创建了一个模拟对象,但是当我调用该方法时 with 我的模拟对象变得无效,当我不把它放在一切正常时。

在模拟对象下方不起作用

$this->controller->Auth
    ->staticExpects($this->any())
    ->method('user')
    ->with('count_id')
    ->will($this->returnValue(9));

感谢您的关注。

-

修改

在我的测试用例的完整代码之上,这是一个非常简单的测试。

class TagsControllerTest extends ControllerTestCase {
    public function testView(){
        $Tags = $this->generate('Tags', array(
            'components' => array(
                'Session',
                'Auth' => array('user')
            )
        ));
        $Tags->Auth->staticExpects($this->any())
            ->method('user')
            ->with('count_id')
            ->will($this->returnValue(2));

        $result = $this->testAction('/tags/view');
        $this->assertEquals($result, 2);
    }
}

我在Tag控制器中的操作代码,这里没有更多(为了测试目的)他们返回一个用count_id作为参数的用户对象。

public function view(){
    return $this->Auth->user('count_id');
}

运行测试我收到了这条消息:

  

方法名称的期望失败等于调用零次或多次时   调用AuthComponent :: user(null)的参数0与期望值不匹配。   声明null与预期的'count_id'匹配失败。

2 个答案:

答案 0 :(得分:1)

在查看AuthComponent代码之后,我认为问题在于你没有嘲笑整个组件你没有嘲笑_getUser()方法。不要忘记:你没有嘲笑的方法是真正的方法!

如果您查看代码,您会看到user()调用了_getUser()startup()又调用了AuthComponent

有两种方法可以解决这个问题,第一种是模拟整个$Tags = $this->generate('Tags', array( 'components' => array( 'Session', 'Auth' /* no methods */ ) ));

_getUser()
user()之外

或模拟$Tags = $this->generate('Tags', array( 'components' => array( 'Session', 'Auth' => array('user', '_getUser') ) ));

{{1}}

希望这可以解决您的问题。

答案 1 :(得分:1)

我遇到的问题是我提供的解决方案无法解决的问题。

解决方案是使用staticExpects()而不是expected(),因为用户是静态函数。

$batches->Auth->staticExpects($this->once())->method('user') 
        ->with('id')
        ->will($this->returnValue(1));