PHPUnitから始めました。私が書いたいくつかの簡単なテストが機能しています。したがって、一般的にPHPUnitは稼働しています。ただし、MySQLiクラスに問題があります。
私のコードでは、問題なく動作します。行は次のとおりです。
$this->mysqli = new \mysqli($this->host, $user->getUser(), $user->getPwd(), $this->db);
この行をphpunitを実行して解析すると、次のエラーメッセージが表示されます(その行を指しています)。
PHP Fatal error: Class 'mysqli' not found in /opt/lampp/htdocs/...
2つの可能性(私が見ているように):
1)MySQLi拡張機能を使用するPHPUnitの正しいセットアップに関連する機能/拡張機能/構成手順/その他の機能がありません。
編集
拡張機能をテストすると、通常のコードextension_loaded('mysqli')
で返されます。true
テスト内で次のことを行うと、テストをスキップします(つまり、戻りますfalse
)。
if (!extension_loaded('mysqli')) {
$this->markTestSkipped(
'The MySQLi extension is not available.'
);
}
/編集
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);
}
}
テストされた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;
}
}
解決
このすべては/インストールの問題でした。PHPを提供するXAMPPインストールを使用しています。PHPUnitを個別にインストールすると、別のセットアップが使用されます。したがって、私のブラウザ(XAMPP搭載)ではすべて問題ありませんでしたが、コマンドラインではMySQLi拡張機能がすべて一緒に欠落しています!Debianはphp5-mysqlndと呼ばれるパッケージを提供しています。これをインストールすると、すべて正常に機能します。(表示される他のエラーを除く:-)