2

我有代码,因此如果从网站“帖子”部分的任何位置访问“添加用户”页面,添加用户后用户将被带到“用户”索引。但是,如果从网站的任何其他部分访问“添加用户”页面,用户将被带回添加用户后的位置。我想测试这个,但我不知道如何。这是我到目前为止所拥有的:

控制器代码

<?php
App::uses('AppController', 'Controller');

class UsersController extends AppController {

    public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                return $this->redirect($this->request->data['User']['redirect']);
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
        else {
            if ($this->referer() == '/' || strpos($this->referer(), '/posts') !== false) {
                $this->request->data['User']['redirect'] = Router::url(array('action' => 'index'));
            }
            else {
                $this->request->data['User']['redirect'] = $this->referer();
            }
        }
    }

    public function index() {
        $this->User->recursive = 0;
        $this->set('users', $this->paginate());
    }
}

测试代码

<?php
App::uses('UsersController', 'Controller');

class UsersControllerTest extends ControllerTestCase {

    public function testAdd() {
        $this->Controller = $this->generate('Users');

        // The following line is my failed attempt at making $this->referer()
        // always return "/posts".

        $this->Controller->expects($this->any())->method('referer')->will($this->returnValue('/posts'));

        $this->testAction('/users/add/', array('method' => 'get'));
        $this->assertEquals('/users', $this->Controller->request->data['User']['redirect']);
    }
}

我究竟做错了什么?

4

1 回答 1

2

你没有嘲笑任何方法

这条线

$this->Controller = $this->generate('Users');

仅生成一个测试控制器,您没有指定任何模拟方法。要指定需要模拟某些控制器方法,请参阅文档

$Posts = $this->generate('Users', array(
    'methods' => array(
        'referer'
    ),
    ...
));

期望永远不会被触发

在问这个问题之前,你的内部对话可能有点像:“为什么说我的期望永远不会被调用?我会使用$this->any()并忽略它..”

不要使用$this->any(),除非调用模拟方法真的无关紧要。查看控制器代码,您希望它只被调用一次 - 所以改为使用$this->once()

public function testAdd() {
    ...

    $this->Controller
        ->expects($this->once()) # <-
        ->method('referer')
        ->will($this->returnValue('/posts'));

    ...
}

PHPUnit 的文档中提供了可用匹配器的完整列表。

于 2013-06-18T08:03:14.620 回答