8

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と呼ばれるパッケージを提供しています。これをインストールすると、すべて正常に機能します。(表示される他のエラーを除く:-)

4

1 に答える 1

5

PHPUnit は通常、CLI - コマンドライン インターフェイス内で実行されます。

そこにある PHP は、Web サーバーとは異なります。バイナリが異なり、多くの場合、構成も異なります。

$ php -r "new mysqli();"

同じエラーが発生するはずです。バイナリと構成がどこにあるかを確認します。

$ which php

$ php -i | grep ini

クラスの拡張機能がmysqliインストールされ、有効になっていることを確認してください。構成したら、単体テストを問題なく実行できるはずです。

于 2012-04-17T16:12:46.573 に答える