【问题标题】:Issue with cakePHP running unit testscakePHP 运行单元测试的问题
【发布时间】:2013-07-11 06:25:04
【问题描述】:

我在尝试在我的 cakePHP 2.0 应用程序中测试某些东西时遇到了最奇怪的问题。我在模型中有一个函数可以查询数据库以检查应用程序在过去 25 天内是否已发送通知:

public function checkIfNotified($userId){
    $query = 'SELECT count(`user_id`) AS notify '.
        'FROM `churn_stats` '.
        'WHERE `user_id` = '. $userId.' '.
        'AND `notified` = 1 '.
        'AND TIME_TO_SEC(TIMEDIFF(NOW(),`created`)) <= 2160000 ';
        $this->log($query);
    $result = $this->query($query);
    return $result;
}

我正在做一些单元测试来检查该方法是否有效,所以我正在创建一个记录并尝试测试它是否返回 true,如下所示:

$data['notified'] = 1;
$data['user_id'] = $userId;
$this->ChurnStats->create();
$this->ChurnStats->save($data);
$notified = $this->ChurnStats->checkIfNotified($userId);
print_r($notified);

在结果之后(这是错误的结果,因为我已经插入了一行!):

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [notify] => 0
                )

        )

)

但是,我运行数据库中代码生成的确切查询,结果是:

我已经浪费了很多时间,我不知道出了什么问题:(。

【问题讨论】:

  • 事务隔离?当您“运行由数据库中的代码生成的确切查询”时,是否在执行插入的同一数据库会话中?如果是这样,插入是否已提交?如果是这样,在插入之前的事务中的 PHP 会话是否在 REPEATABLE READ 级别隔离?
  • 是的,是同一个数据库会话,我在代码执行后中断测试执行以防止 UnitTest 擦除临时。表。不是事务,所以不需要提交(其他测试就像这样运行并且工作正常)我也做了一个 $this->ChurnStats->find('all');它返回我刚刚插入的行。但是我不知道那个级别。

标签: mysql cakephp phpunit


【解决方案1】:

在测试和检查所有内容后,这是另一个测试函数,它以某种方式改变了数据库或下一个测试的查询,但奇怪的是另一个测试调用了相同的查询,但没有任何插入、更新或删除可能会修改下一次测试的结果或环境。

检查完所有内容后,一切都归结为:查询缓存,默认情况下,CakePHP 缓存所有 $this->query("...");调用所以修复很简单:停用它!

$result = $this->query($query, false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2014-09-07
    • 2011-02-23
    相关资源
    最近更新 更多