CodeIgniter4 數據庫測試

2020-08-17 17:42 更新

測試類

為了利用CodeIgniter提供的用于測試的內置數據庫工具,您的測試必須擴展CIDatabaseTestCase

  1. <?php namespace App\Database;
  2. use CodeIgniter\Test\CIDatabaseTestCase;
  3. class MyTests extends CIDatabaseTestCase
  4. {
  5. . . .
  6. }

因為在setUp()tearDown()階段執(zhí)行了特殊功能,所以如果需要使用父方法,則必須確保調用它們的方法,否則將丟失此處描述的許多功能:

  1. <?php namespace App\Database;
  2. use CodeIgniter\Test\CIDatabaseTestCase;
  3. class MyTests extends CIDatabaseTestCase
  4. {
  5. public function setUp()
  6. {
  7. parent::setUp();
  8. // Do something here....
  9. }
  10. public function tearDown()
  11. {
  12. parent::tearDown();
  13. // Do something here....
  14. }
  15. }

設置測試數據庫

在運行數據庫測試時,您需要提供一個可以在測試期間使用的數據庫。該框架提供了特定于CodeIgniter的工具,而不是使用PHPUnit內置的數據庫功能。第一步是確保您已testsapp / Config / Database.php中設置了一個數據庫組。這指定了僅在運行測試時使用的數據庫連接,以確保其他數據的安全。

如果團隊中有多個開發(fā)人員,則可能需要將憑據存儲在.env文件中。為此,請編輯文件以確保存在以下各行并具有正確的信息:

  1. database.tests.dbdriver = 'MySQLi';
  2. database.tests.username = 'root';
  3. database.tests.password = '';
  4. database.tests.database = '';

遷移與種子

運行測試時,您需要確保數據庫具有正確的架構設置,并且每個測試都處于已知狀態(tài)。通過向測試中添加幾個類屬性,可以使用遷移和種子設置數據庫。

  1. <?php namespace App\Database;
  2. use CodeIgniter\Test\CIDatabaseTestCase;
  3. class MyTests extends\CIDatabaseTestCase
  4. {
  5. protected $refresh = true;
  6. protected $seed = 'TestSeeder';
  7. protected $basePath = 'path/to/database/files';
  8. }

$refresh

此布爾值確定在每次測試之前是否完全刷新數據庫。如果為true,則將所有遷移回滾到版本0,然后將數據庫遷移到最新的可用遷移。

$seed

如果存在且不為空,則此參數指定種子文件的名稱,該種子文件用于在每次運行測試之前用測試數據填充數據庫。

$basePath

默認情況下,CodeIgniter將在tests / _support / Database / Seeds中查找以在測試期間運行它的種子。您可以通過指定$basePath屬性來更改此導演。它不應該包括種子目錄,而是包含子目錄的單個目錄的路徑。

$namespace

默認情況下,CodeIgniter將在tests / _support / DatabaseTestMigrations / Database / Migrations中查找以定位在測試期間應運行的遷移。您可以通過在$namespace屬性中指定新的名稱空間來更改此位置。這不應包括數據庫/遷移路徑,而應僅包括基本名稱空間。

輔助方法

CIDatabaseTestCase類提供了一些輔助方法在測試你的數據庫,以幫助。

seed($name)

允許您將“種子”手動加載到數據庫中。唯一的參數是要運行的種子的名稱。種子必須存在于中指定的路徑中$basePath

dontSeeInDatabase($ table,$ criteria)

斷言$criteria數據庫中不存在具有與鍵/值對匹配的條件的行。

  1. $criteria = [
  2. 'email' => 'joe@example.com',
  3. 'active' => 1
  4. ];
  5. $this->dontSeeInDatabase('users', $criteria);

seeInDatabase($ table,$ criteria)

斷言$criteria數據庫中存在具有與DOES中的鍵/值對匹配的條件的行。

  1. $criteria = [
  2. 'email' => 'joe@example.com',
  3. 'active' => 1
  4. ];
  5. $this->seeInDatabase('users', $criteria);

captureFromDatabase($ table,$ column,$ criteria)

返回與$column行匹配的指定表中的值$criteria。如果找到多個行,它將僅針對第一行進行測試。

  1. $username = $this->grabFromDatabase('users', 'username', ['email' => 'joe@example.com']);

hasInDatabase($ table,$ data)

在數據庫中插入新行。當前測試運行后,該行將被刪除。$data是具有要插入表中的數據的關聯數組。

  1. $data = [
  2. 'email' => 'joe@example.com',
  3. 'name' => 'Joe Cool'
  4. ];
  5. $this->hasInDatabase('users', $data);

seeNumRecords($ expected,$ table,$ criteria)

斷言在數據庫中找到了許多匹配的匹配行$criteria。

  1. $criteria = [
  2. 'active' => 1
  3. ];
  4. $this->seeNumRecords(2, 'users', $criteria);
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號