Test DB operations with SQLite in-memory, transaction rollback, or fixture-seeded test databases.
Database Testing Patterns
// Option 1: In-memory SQLite
protected function createDatabase(): PDO {
$pdo = new PDO("sqlite::memory:");
$pdo->exec(file_get_contents("schema.sql"));
return $pdo;
}
// Option 2: Test transactions (rollback after each test)
class TransactionalTestCase extends TestCase {
protected PDO $pdo;
protected function setUp(): void {
$this->pdo = Database::connect();
$this->pdo->beginTransaction();
}
protected function tearDown(): void {
$this->pdo->rollBack();
}
}
// Option 3: Fixtures — pre-defined test data
class UserRepositoryTest extends TestCase {
private function seedUsers(): void {
$this->pdo->exec("INSERT INTO users (name,email) VALUES
("Alice","alice@test.com"),
("Bob","bob@test.com")");
}
public function testFindByEmail(): void {
$this->seedUsers();
$user = (new UserRepository($this->pdo))->findByEmail("alice@test.com");
$this->assertEquals("Alice", $user["name"]);
}
}