3

一般来说,我是 phpunit 和单元测试的新手。我正在尝试将大型应用程序转换为 cakephp 2.0 并对所有内容进行单元测试。

我正在尝试创建一个模拟对象,在该对象中调用 $this->Session->read('Auth.Account.id') 时,它返回 144 ...这将提供一个具有包含项目的 id 的帐户。

但是,我收到一个错误,因为 Mock 似乎在各种 beforeFilter 调用中的其他 Session::read('AuthCode') 调用上出错;

方法名称的期望失败等于调用 1 次时调用的参数 0 SessionComponent::read('AuthCode') 与期望值不匹配。断言两个字符串相等时失败。

就像我说我是 phpunit 和单元测试的新手......我做错了什么?

class PagesController extends MastersController {
        public function support(){
        if($this->Session->read('Auth.Account.id')) {
            $items = $this->Account->Items->find('list', array('conditions'=>array('Items.account_id'=>$this->Session->read('Auth.Account.id'))));           
        }
        $this->set(compact('items'));
    }
}


class PagesControllerTestCase extends CakeTestCase {
        /**
     * Test Support
     *
     * @return void
     */
    public function testSupport() { 
        #mock controller
        $this->PagesController = $this->generate('Pages', array(
            'methods'=>array('support'),
            'components' => array(
                'Auth',
                'Session',
            ),
        ));

                #mock controller expects
        $this->PagesController->Session->expects(
            $this->once())
                ->method('read') #Session:read() method will be called at least once
                ->with($this->equalTo('Auth.Account.id')) #when read method is called with 'Auth.Account.id' as a param
                ->will($this->returnValue(144)); #will return value 144


        #test action
        $this->testAction('support');
    }
}
4

2 回答 2

1

我决定手动编写会话。就像他们所做的一样,是核心中的 SessionComponentTest。

https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SessionComponentTest.php

于 2012-05-16T19:46:26.020 回答
1

您应该使用 Auth 组件而不是 Session 组件来访问 Auth 会话变量。

代替

if($this->Session->read('Auth.Account.id')) {

尝试

if ($this->Auth->user('Account.id')) {

您的 Items::find 调用也是如此。

模拟 Auth 组件仍然是要走的路。

class PagesControllerTestCase extends CakeTestCase {

应该

class PagesControllerTestCase extends ControllerTestCase {

然后在你的测试中:

$PagesController = $this->generate('Pages', array(
    'methods'=>array('support'),
    'components' => array(
        'Auth' => array('user')
     ),
));

$PagesController->Auth->staticExpects($this->exactly(2))
    ->method('user')
    ->with('Account.id')
    ->will($this->returnValue(144));
于 2012-05-27T04:28:23.853 回答