【问题标题】:How to choose the test DB cakePHP testing如何选择测试数据库 cakePHP 测试
【发布时间】:2012-04-24 03:01:00
【问题描述】:

我正在使用 cake bake 命令来创建我的夹具和测试模型。我已经用我的一个模型成功地完成了它,但我在另一个模型上遇到了问题。

我不知道为什么,它尝试使用默认数据库,而不是使用我已经定义的测试数据库,这是我测试的第一个模型使用的数据库。

两个测试模型,一个运行良好,第二个不运行,都是用蛋糕烘焙创建的,它们看起来完全一样。

他们俩的夹具类中都有这个:

public $import = array('records' => true, 'connection' => 'test');

Test 定义了与我的测试数据库的连接。 可能是什么问题?

我做了一些奇怪的实验。在我的测试模型中,如果我使用单数而不是复数,它适用于默认数据库 BUT 如果我将其更改为复数,它适用于测试数据库。 (但它不能调用模型中的任何方法,只是定义了find()等方法)。

例如:

public function setUp() {
    parent::setUp();

    //uses the default DB (i dont know why)
    $this->Post = ClassRegistry::init('Post');          
    print_r($this->User->find('all'));

    $this->Post->updatePostsStatus(1); //works well

    //uses the default Test Database (i dont know why either)
    $this->Post = ClassRegistry::init('Posts');         
    print_r($this->User->find('all'));   

    $this->Post->updatePostsStatus(1); //doesn't work. No function found.
    /*SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'updatePostsStatus' at line 1*/

}

谢谢。

我已经更新了。

最后更新和解决方案

问题在于 Post Model 构造函数的初始化错误。 使用复数是不相关的。就像使用任何不存在的模型一样。它将始终获取测试数据库。 构造函数良好初始化的答案在这里: How to override model's constructor correctly in CakePHP

【问题讨论】:

  • 我认为注册表中有一个名为Post 的类附加到default 数据库,它可能之前已经实例化。当您尝试调用 Posts 时,Cake 在注册表中找不到任何具有该名称的类,因此它会创建一个新类,并且由于您在测试套件中,它假定数据库为新类 Poststest
  • 那你建议我怎么做?
  • 对不起,我也有点迷路了。不过有一件事......你有没有尝试导入像public $import = array('Post')这样的记录?它应该自动附加test db。
  • 我不想导入它们。我想添加我在我的灯具上创建的那些。

标签: database cakephp testing cakephp-2.0


【解决方案1】:

这种 MySQL 错误可能在 CakePHP 中非常误导。

基本上,实际问题出在$this->Post->updatePostsStatus(1); 这一行,具体来说,就是posts 模型的Post 模型或updatePostsStatus() 方法不存在。

你这行基本上有错字,检查方法名。应该是updatePostStatus吗? (帖子上没有复数?)


出于某种原因,如果您尝试在 CakePHP 中调用模型上未定义的方法,而不是报告未找到该方法,CakePHP 的“自动性”就会发挥作用,奇怪的是它会尝试将未找到的方法名称直接推入MySQL。

基本上,因为CakePHP 找不到$this->Post->updatePostsStatus(1); 方法,它实际上是在尝试执行updatePostsStatusmysql_query("updatePostsStatus'); 的MySQL 查询,这就是我们看到这个奇怪的数据库错误的原因。您可能只是拼错了方法名称。


如果方法名仍然不是问题,则与Posts 模型未正确实例化有关。尽管只要你把所有的名字都记对了,这似乎是值得怀疑的。这绝对不是数据库问题,只是 Cakes 自动处理未知类方法的蹩脚方式。

【讨论】:

  • 嗨 Dunhamzzz,我将更新我的问题,因为在与 Mark Story 交谈后我已经得到了答案。无论如何,谢谢!问题在于 Post 模型的构造函数初始化错误。您可以在这里找到解决方案:stackoverflow.com/questions/10153841/…
  • 酷,这有点像我说的,Cake 无法调用 updatePostsStatus() 方法,因为 Post 模型没有正确实例化。
猜你喜欢
  • 2011-03-20
  • 2019-12-12
  • 2014-12-31
  • 2015-01-26
  • 2020-04-26
  • 1970-01-01
  • 2020-12-13
  • 2023-04-04
  • 2012-04-22
相关资源
最近更新 更多