【发布时间】: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