CakePHP UnitTest调用另一个模型的方法

时间:2013-08-27 21:56:39

标签: cakephp model phpunit

我正在CakePHP(PHPUnit)中编写各种模型测试

在TravisCI中,我得到类似的结果:“找不到基表或视图:1146表'test.events' 在Cake的测试运行器中,我得到断言失败。

我遇到的问题是我的ModelClasses中有一些方法,我试图用App :: use调用其他模型。例如:

用户模型的方法:

public function getOtherData() {
    App::uses('Event', 'Model');
    $this->Event = new Event;
    return $this->Event->find('all');
}

测试:

public function testGetOtherData() {
    $result = $this->User->getOtherData();
    $this->assertTrue(!empty($result));
}

注意上面的例子就是这样。一个例子,简化以显示问题。我知道上面的例子有更好的“蛋糕”方式。

另外,我正在使用定义所需的灯具,它们工作得很好。 (我在模型中使用find中的连接而不是App :: Uses())中的另一种方法知道这一点

编辑: 运行时的代码工作,但UnitTest正在寻找默认数据库中的其他模型数据(当使用App :: uses时),而不是测试数据库。为什么不使用测试数据库?我错过了什么吗?

最后注意

使用App :: uses()然后实例化该类将在运行时工作。但在测试期间,它将失败,因为它尝试使用默认数据库连接,而不是测试数据库连接。

根据所选答案,您可以在另一个模型方法中包含一个模型,而不是使用App :: uses,Cakes在类注册表ClassRegistry::init('Model', true);中构建。

1 个答案:

答案 0 :(得分:1)

使用新语句在函数中间实例化对象通常不是一个好主意。这就是为什么 - 没有办法阻止或重定向该呼叫。此外,当对象的构造函数位于另一个函数的中间时,获取正确的参数并不一定容易,因此最好将该代码保持独立。

执行此操作的正确方法是使用不同的方法调用来获取对象。如果使用Cake的ClassRegistry::init()创建模型对象,则应使用测试数据库。

如果您需要创建其他非Cake对象,最好使用其他功能创建它们,例如$this->fetchMeOneOThemEventThingies()。然后,在测试期间,您可以模拟该函数并让它返回其他内容。或者,你可以使用像pimple这样的其他DI容器,它将扮演与Cake的ClassRegistry相同的角色。

如果需要模拟模型对象进行测试,请确保将适当的参数作为第getMock()的第三个参数传递给模型的构造函数,或者它可以使用生产数据库。

相关问题