【问题标题】:why is my mysqli instance failing when unit testing?为什么我的 mysqli 实例在单元测试时失败?
【发布时间】:2015-09-03 17:33:56
【问题描述】:

恐怕我对单元测试比较陌生。

我有一个名为“dbRecord”的 PHP 类,我用它来抽象数据库表/记录,并尝试对其应用单元测试。但是,当我这样做时,它使用的 mysqli 对象似乎中断了。

例如,我有一个用户类(抽象 dbRecord 类的扩展),如果我在 shell 中创建和保存用户,它会很好地工作。应该是这样的:

$u = new userClass();
$u->setEmail('foo@bar.com');
$u->save();

如果我在网站或 php shell 中使用它,效果会非常好。它创建一个对象,设置电子邮件值,然后将其保存在数据库中,将自动递增的 id 字段分配回 $u 对象。

如果我尝试创建一个单元测试,它会在保存记录时失败。当它尝试使用 mysqli::real_escape_string 时发生错误,但它发生在 mysqli 对象的任何其他成员上(我已经测试过以防万一)。我得到的错误是:

mysqli::real_escape_string(): Couldn't fetch mysqli

因此,我假设在进行单元测试时,我无法理解事物范围内的某些内容。这是我正在运行的测试的完整代码:

<?php
require_once "../dbTemplate.php";
class TestOfUserClass extends PHPUnit_Framework_TestCase {
        function testAssignUserValues(){
                $usr = new userClass();
                $usr->setEmail('foo@bar.com');
                $this->assertTrue($usr->getEmail() == 'foo@bar.com');
                $usr->save();
        }
}

实际引发该异常的代码在 save 调用中。这是它的样子:

    public function save(){
            if($this->_isNewRecord){
                    // we're creating a new record
                    $query = "INSERT INTO `" . $this->_mysqli->real_escape_string($this->_tableName) . "`";
                    ...

在这一点上,我很困惑为什么它不能使用那个 mysqli 实例。同样,这在常规使用下完美运行(通过网页上的 apache 或通过 php shell)。只有在使用测试用例时它才会死掉。我用 Simpletest 和 PHPUnit 都试过了,结果一样。

访问 mysqli 对象的结构如下:

在我的测试文件(test1.php)中,“../dbTemplate.php”包含在顶部。

在 dbTemplate.php 中:

  • mysqli 对象在顶部创建,分配给名为 $mysqli 的变量。
  • 然后定义 dbRecord 抽象类
  • 在该定义的构造中,$this->_mysqli 被赋值为 $mysqli。

测试文件与上面引用的完全一样。

当然,我运行“phpunit test1.php”

有人看到我在这里做错了吗?

【问题讨论】:

  • 不得不去城市词典那个。我们在这里进行问题营销,所以我杀了那部分
  • 您能否确认该课程实际上可以从您的测试课程中访问?您将希望在setUp() 中实例化您正在测试的对象,而不是测试功能。如果您在那里遇到异常,则通常意味着无法从测试文件夹解析 dbTemplate.php 的路径。
  • @ElliotRodriguez:做到了!我必须添加该设置函数,在那里创建我的用户对象,并且〜还〜创建一个新的 mysqli 对象并将其分配给用户。然后测试顺利通过。你或某人能解释一下为什么这是必要的吗? dbTemplate 类确实可以访问,只是其中的 mysqli 对象不能访问。

标签: php mysql unit-testing mysqli scope


【解决方案1】:

您将希望在 setUp() 中实例化您正在测试的对象,而不是在测试函数中。如果您在那里遇到异常,则通常意味着无法从测试文件夹解析 dbTemplate.php 的路径。

如果不看你的类的内容,很难准确解释,但一般来说,如果你不使用自动加载,phpunit 将无法解析位于测试根文件夹之外的其他文件的位置。然而,在 bootstrap.php 中使用自动加载器会对此有所帮助。见PHPUnit Bootstrap and Autoloading Classes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多