CakePHP的Mocking模型没有按预期工作

时间:2014-01-09 20:12:58

标签: php unit-testing cakephp testing phpunit

我正在尝试在cakePHP中编写我的第一个单元测试。 我想通过以下操作尝试一下:

public function joinLobby($userId = null, $lobbyId = null) {
    // json webservice layout
    $this->layout = 'ajax';

    if (!$userId || !$lobbyId) {
        throw new CakeException(__('Paramter(s) missing'));
    }
    if (!$this->Lobby->exists($lobbyId)) {
        throw new CakeException(__('Invalid lobby supplied'));
    }
    if (!$this->User->exists($userId)) {
        throw new CakeException(__('Invalid user supplied'));
    }

    $this->__addUsersToLobby(array($userId), $lobbyId);
}

到目前为止我的测试用例是这样的:

public function testShouldNotAddNonExistentUserToLobby() {
    $this->LobbiesController = $this->generate('Lobbies', array(
        'methods' => array(
            'joinLobby',
            '__addUsersToLobby'
        ),
        'models' => array(
            'Lobby',
            'User'
        )
    ));
    $this->LobbiesController->Lobby->expects($this->any())->method('exists')->will($this->returnValue(true));
    $this->LobbiesController->User->expects($this->once())->method('exists')->will($this->returnValue(false));
    $this->LobbiesController->expects($this->never())->method('__addUsersToLobby');
    $this->testAction('Lobbies/joinLobby/1/1');
}

当我进行测试时,我得到了这个:

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

我能让测试通过的唯一方法是将“$ this-> once()”更改为“$ this-> any()”或“$ this-> never()”。

任何帮助? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

我终于成功了。 问题是我在嘲笑我正在测试的同一个函数,所以它实际上并没有被调用。因此,未执行调用其他函数的代码。 从'methods'数组中删除'joinLobby'就可以了。

干杯