2012-04-17 2 views
7

방금 ​​PHPUnit으로 시작했습니다. 내가 작성한 몇 가지 간단한 테스트가 효과가 있습니다. 따라서 일반적으로 PHPUnit이 실행 중입니다. MySQLi 클래스에는 문제가 있습니다.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/... 

두 가지 가능성 (내가보기로) :

1) MySQLi 확장 기능을 사용하는 PHPUnit의 올바른 설정과 관련된 몇 가지 기능/확장/구성 단계/기타가 없습니다.

편집

나는 확장 extension_loaded('mysqli') 내 정상적인 코드에서 true을 반환에 대한 테스트를합니다. 내가 테스트 내에서 다음을 수행하는 경우는 시험을 생략 (즉, 그것은 false을 반환) :

if (!extension_loaded('mysqli')) { 
    $this->markTestSkipped(
     'The MySQLi extension is not available.' 
    ); 
} 

/EDIT

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('[email protected]')); 

     $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); 
    } 
} 

테스트 된 연결 클래스는 다음과 같습니다

<?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 확장 모두 함께 누락되었습니다! 데비안은 이라는 패키지를 제공합니다 (php5-mysqlnd). 이 모든 것을 잘 설치하면됩니다! (다른 오류는 제외하고 :-)

+0

[mysqli 클래스 요구 사항] (http://www.php.net/manual/en/mysqli.requirements.php)이 충족 되었습니까? 연습 : 짧은 테스트 코드를 사용하고 있다는 것을 보여 주면 출력됩니다. – hakre

+0

그것이 내 코드에서 작동하는 것 외에 다른가요? 내가 말했듯이 : 코드 라인은 mysqli 객체를 자체적으로 (즉, phpunit없이) 실행하면 유효한 mysqli 객체를 생성한다. PHP는 mysqlnd (5.0.8-dev - 20102224 - $ Revision : 310735 $) – fourreux

+1

으로 구성되어 있습니다. 쉘에서 실행하면 다음과 같은 결과가 나옵니다 :'$ php -r "new mysqli();"? PHPUnit은 어떤 구성을 사용합니까? PHPUnit 용 PHP를 호출했을 때 PHP가 구성되었다는 것을 증명해주십시오. PHP는 그 클래스가 존재하지 않는다는 것을 알려주고, 여러분은 확장을 설정하지 않았다. – hakre

답변

5

PHPUnit은 일반적으로 명령 줄 인터페이스 (CLI) 내에서 실행됩니다.

거기에있는 PHP는 웹 서버와 다릅니다. 다른 바이너리 및 종종 다른 구성뿐입니다.

$ php -r "new mysqli();" 

같은 오류가 발생합니다. 바이너리 및 구성의 위치 확인

$ which php 

그리고

$ php -i | grep ini 

가 설치 the extension for the mysqli class를 얻고 사용하도록 설정해야합니다. 일단 구성되면 유닛 테스트를 완벽하게 실행할 수 있어야합니다.

+0

이것은 나를 위해 까다로운 하나, 내가 사용했던 이진 빌드에서 버크로 밝혀졌다. 귀하의 팁 덕분에 그것을 밖으로 suss 도움이 감사합니다! –

관련 문제