0

我正在用 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() 然后实例化该类将在运行时工作。但是在测试期间它会失败,因为它会尝试使用默认数据库连接,而不是测试数据库连接。

ClassRegistry::init('Model', true);根据选定的答案,您可以从另一个模型方法中包含模型,而不是使用 App::uses、Cakes built in class registry, 。

4

1 回答 1

1

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

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

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

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

于 2013-08-27T22:45:23.033 回答