2017-07-17 36 views
0

我正在嘗試在我正在開發的學校項目上編寫一個PHPUnit測試函數。這些功能在正常的網站上正常工作。但是當我嘗試用PHPUnit測試與數據庫相關的操作時,我總是收到mysqli_query(): Couldn't fetch mysqlimysqli_query():在PHPUnit中測試PHP函數時無法獲取mysqli

這裏是一個示例代碼段:

PHPUnit的文件:test.php的

function testFindById() { 
    $expected_object = "Artist"; 
    $result = Artist::find_by_id($id); 
    $result_type = gettype($result); 
    $this->assertEquals($expected_object, $result_type); 
} 

DatabaseHelper類別:DatabaseHelper.php

public static function find_by_sql($sql) { 
    global $database; 

    $result = $database->query($sql); 
    $objects = array(); 
    if ($result) { 
     while ($row = mysqli_fetch_array($result)) { 
      $objects[] = static::new_instance($row); 
     } 
    } 
    return $objects; 
}  

public static function find_by_id($id) { 
    global $database; 

    $sql = "SELECT * FROM " . static::$table_name . " WHERE id = $id LIMIT 1"; 
    $result = static::find_by_sql($sql); 
    if (!empty($result)) { 
     return array_shift($result); 
    } else { 
     return false; 
    } 
} 

藝術家類別: Artist.php

class Artist extends DatabaseHelper { 
    protected static table_name = "artists"; 
    // more irrelevant code follows 
} 

測試輸出

C:\Xampp\htdocs\musicstore-oop-beta\test>phpunit --verbose MusicStoreTest.php 
PHPUnit 3.7.21 by Sebastian Bergmann. 

SSE 

Time: 0 seconds, Memory: 2.00Mb 

There was 1 error: 

1) MusicStoreTest::testFindById 
mysqli_query(): Couldn't fetch mysqli 

C:\Xampp\htdocs\musicstore-oop-beta\app\Database.php:38 
C:\Xampp\htdocs\musicstore-oop-beta\app\DatabaseHelper.php:23 
C:\Xampp\htdocs\musicstore-oop-beta\app\DatabaseHelper.php:37 
C:\Xampp\htdocs\musicstore-oop-beta\test\MusicStoreTest.php:62 

There were 2 skipped tests: 

1) MusicStoreTest::testAddArtist 
Artist Add Test Skipped 

C:\Xampp\htdocs\musicstore-oop-beta\test\MusicStoreTest.php:24 

2) MusicStoreTest::testAddAlbum 
Album Add Test Skipped 

C:\Xampp\htdocs\musicstore-oop-beta\test\MusicStoreTest.php:40 

FAILURES! 
Tests: 3, Assertions: 0, Errors: 1, Skipped: 2. 
+0

聽起來像測試沒有正確設置。您的測試設置中是否有可用的數據庫連接? – hakre

回答

-1

時,無論是數據庫變量(在你的情況$數據庫)並不是指連接的數據庫出現這種情況。您應該檢查數據庫連接是否有效:

$database = new mysqli('db_host','user','password','db_name'); 

if ($database->connect_errno) { 
    error_log("Errno: " . $mysqli->connect_errno . ':' . mysqli->connect_error); 
} 

如果用於存儲數據庫對象的變量不在範圍內,也會發生這種情況。如果缺少語句global $database;(不適用於具有該語句的代碼),那麼$database將僅具有本地函數作用域 - 它將是與全局變量$database不同的變量。