【问题标题】:Controller Unit Test fails with SQLSTATE[42000] error控制器单元测试失败并出现 SQLSTATE[42000] 错误
【发布时间】:2013-12-21 23:23:34
【问题描述】:

我想对控制器操作进行单元测试,但在执行它时遇到了一些问题。 我得到的错误如下:

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在“questionExists”附近使用正确的语法 在第 1 行

方法:

问题存在

在问题模型中定义。

我的测试函数如下所示:

public function testView() {
        $result = $this->testAction('/questions/questions/view/1', array('return' => 'vars'));
    }

我要测试的控制器动作如下所示:

公共函数视图($id = null) {

    if (!$this->Question->questionExists($id, 'id_virtual')) {
        throw new NotFoundException(__('Invalid question'));
    }
    $options = array('conditions' => array('Question.id_virtual' => $id));
    $this->set('question', $this->Question->find('first', $options));
}

所以这让我很困惑。 谁能指出我正确的方向?

【问题讨论】:

  • 您可以检查您的 Question 对象的类 (debug(get_class($$this->Question)); - 它将是 AppModel) 以确认 burzum 的答案。典型的原因是文件名中的拼写错误。
  • 我认为这不可能是重复的。我刚刚在单元测试中遇到错误。 appmis 运行完美
  • 所有此类错误的原因都是一样的:模型实例没有实现被调用的方法。在您的情况下,可能在模型Question.Question 之前发现了对模型Question(这将是一个AppModel 实例)的引用。当您找到原因时(到目前为止,cmets 只描述了一种解决方法),请将其添加为答案 =)。

标签: unit-testing cakephp cakephp-2.4


【解决方案1】:

找不到您的模型类,CakePHP 为该表动态创建一个实例,但这只是基本的模型类。然后调用代码时,它会尝试在应用程序中不是您的 Question 模型的实例上调用该方法。你必须弄清楚会发生什么。

【讨论】:

  • 这个问题很好奇。在我的 QuestionsController 中添加此行 public $uses = array('Questions.Question'); 后,测试运行完美。但现在我对此很困惑。我以前从来不需要添加这一行。
  • 我还注意到,如果我使用$this->autoMock = false; 一切正常。
  • 在这种情况下,我猜如果 autoMock 为真,您的模型就会被模拟。因此,您必须根据模型调用的期望工作。只需检查该对象是否为模拟对象以及是否使用 expects() 即可。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2014-11-27
  • 2016-07-14
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多