fou*_*eux 8 php phpunit mysqli
我刚开始使用PHPUnit.我写的一些简单测试正在进行中.所以一般来说PHPUnit已启动并正在运行.但MySQLi类有问题.
在我的代码中它工作正常.这是行:
$this->mysqli = new \mysqli($this->host, $user->getUser(), $user->getPwd(), $this->db);
Run Code Online (Sandbox Code Playgroud)
当运行phpunit解析此行时,我收到以下错误消息(指向该行):
PHP Fatal error: Class 'mysqli' not found in /opt/lampp/htdocs/...
Run Code Online (Sandbox Code Playgroud)
两种可能性(我认为):
1)我缺少一些功能/扩展/配置步骤/与使用MySQLi扩展的PHPUnit的正确设置相关的其他内容.
编辑
如果我测试扩展,extension_loaded('mysqli')它会true在我的正常代码中返回.如果我在测试中执行以下操作,它会跳过测试(即返回false):
if (!extension_loaded('mysqli')) {
$this->markTestSkipped(
'The MySQLi extension is not available.'
);
}
Run Code Online (Sandbox Code Playgroud)
/编辑
2)我的代码可能有问题.我正在尝试模拟User对象以进行测试连接.所以这里是:
<?php
class ConnectionTest extends \PHPUnit_Framework_TestCase
{
private $connection;
protected function setUp()
{
$user = $this->getMockBuilder('mysqli\User')
->setMethods(array('getUser', 'getPwd'))
->getMock();
$user->expects($this->once())
->method('getUser')
->will($this->returnValue('username'));
$user->expects($this->once())
->method('getPwd')
->will($this->returnValue('p@ssw0rd'));
$this->connection = new \mysqli\Connection($user);
}
public function testInternalTypeGetMysqli()
{
$actual = $this->connection->getMysqli();
$expected = 'resource';
$this->assertInternalType($expected, $actual);
}
protected function tearDown()
{
unset($this->connection);
}
}
Run Code Online (Sandbox Code Playgroud)
经过测试的Connection类看起来像这样:
<?php
namespace mysqli;
class Connection
{
protected $mysqli;
protected $host = 'localhost';
protected $db = 'database';
public function __construct(\mysqli\User $user)
{
$this->mysqli = new \mysqli($this->host,
$user->getUser(),
$user->getPwd(),
$this->db);
if (mysqli_connect_errno()) {
throw new \RuntimeException(mysqli_connect_error());
}
}
public function getMysqli()
{
return $this->mysqli;
}
}
Run Code Online (Sandbox Code Playgroud)
解
整件事是安装问题.我正在使用提供PHP 的XAMPP安装.独立安装PHPUnit使其使用不同的设置!所以在我的浏览器(XAMPP驱动)一切都很好,但在我的命令行中,MySQLi扩展已经一共丢失了!Debian提供了一个名为php5-mysqlnd的软件包.安装好这一切都很好!(除了出现的其他错误:-)
PHPUnit通常在CLI - 命令行界面中运行.
你所拥有的PHP与网络服务器不同.不同的二进制文件也经常是不同的配置.
$ php -r "new mysqli();"
Run Code Online (Sandbox Code Playgroud)
应该给你同样的错误.验证二进制文件和配置的位置:
$ which php
Run Code Online (Sandbox Code Playgroud)
和
$ php -i | grep ini
Run Code Online (Sandbox Code Playgroud)
确保您已安装并启用了mysqli类的扩展.配置完成后,您应该能够完美地运行单元测试.
| 归档时间: |
|
| 查看次数: |
4045 次 |
| 最近记录: |