3

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

在模拟对象下方不起作用

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

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

方法名称的期望失败等于调用 0 次或多次时 调用 AuthComponent::user(null) 的参数 0 与期望值不匹配。无法断言 null 与预期的“count_id”匹配。

4

2 回答 2

1

我面临着同样的问题,我无法通过提供的解决方案来解决。

解决方案是使用 staticExpects() 而不是 expects() 因为 user 是一个静态函数。

$batches->Auth->staticExpects($this->once())->method('user') 
        ->with('id')
        ->will($this->returnValue(1)); 
于 2012-08-01T12:42:11.097 回答
1

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

如果您查看代码,您会看到user()被调用的代码,而被调用的代码_getUser()又被调用startup()

有两种方法可以解决这个问题,第一种是mock整个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')
        )
    ));

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

于 2012-07-06T11:16:53.553 回答