【问题标题】:CakePHP UnitTest a method which calls another modelCakePHP UnitTest 一个调用另一个模型的方法
【发布时间】:2013-08-28 08:16:21
【问题描述】:

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

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

我遇到的问题是我的 ModelClasses 中有一些方法,我正在尝试测试哪些方法会使用 App::uses 调用其他模型。例如:

用户模型方法:

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

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

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

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

最后说明

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

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

【问题讨论】:

  • 您确定您的模型中没有设置 $useDbConfig 属性吗?
  • 我确定@joshua.paling 谢谢 :)

标签: cakephp model phpunit


【解决方案1】:

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

正确的方法是使用不同的方法调用来获取您的对象。如果你使用 Cake 的ClassRegistry::init() 创建模型对象,他们应该使用测试数据库。

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

如果您需要一个模拟模型对象进行测试,请务必将适当的参数作为第三个参数传递给模型的构造函数getMock(),否则它可能会使用生产数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多