我想寫一個函數,其目的是測試數據庫連接。它所做的是實例化Database
對象,嘗試連接到數據庫並返回結果。如何使用PHPUnit模擬和測試實例化對象的函數?
的僞代碼看起來像這樣
<?php
function testDatabaseLogin() {
// Get the database connection information from a file
// ...
// Database is a class which stores the connection information passed,
// When its connect() method is invoked, it tries to connect. nothing fancy
$conn = new Database($host, $port, $username, $password);
return $conn->connect(); // TRUE on success, FALSE otherwise
}
?>
此代碼段是我的情況的簡化版本,但應該足以說明我的問題。
我想知道我在本例中如何使用PHPUnit來模擬Database
類。我要的是我可以
- 斷言,當此函數實例
Database
是正確的 - 存根的
Database
控制connect()
的參數,以返回TRUE
或FALSE
,所以我並不需要真正嘗試連接到一個真實的數據庫
我搜索了四周,但我發現它似乎像PHPUnit Mock對象不以這種方式工作。任何幫助表示感謝。在底線,如果它有助於簡化測試,則更改函數實現是可以接受的。
謝謝。
不知道這是否有幫助,但我問了一個涉及嘲諷PDO連接的問題(https://stackoverflow.com/questions/46379109/testing-coverage-with-phpunit-and-pdo)。您可能需要驗證參數的合理值,因爲沒有連接就無法檢查它們實際上是否有效。 –
@NigelRen感謝您的幫助。我認爲我的情況與你的不同,因爲你的'DBAccess'類接受'PDO'對象。所以你可以使用PHPUnit來模擬'PDO'對象並傳遞它。但在我的情況下,'數據庫'對象是在函數內部實例化的,這意味着即使我有一個模擬對象,我也沒有辦法將它傳遞給它。所以我在想,如果PHPUnit不能處理這種情況,我應該嘗試重構函數以使其可測試。 – user7509214
我認爲一般的共識是能夠注入任何依賴以啓用測試等,https://stackoverflow.com/questions/130794/what-is-dependency-injection提供了更多的細節。 –