Häufige Probleme beim PHP-Unit-Testen: Externe Abhängigkeitstests: Verwendung eines Mocking-Frameworks (wie Mockery), um gefälschte Abhängigkeiten zu erstellen und ihre Interaktionen zu bestätigen. Testen privater Mitglieder: Verwenden Sie Reflection-APIs wie ReflectionMethod, um auf private Mitglieder zuzugreifen, oder verwenden Sie Testsichtbarkeitsmodifikatoren wie @protected. Datenbankinteraktionstests: Richten Sie den Datenbankstatus mithilfe eines Datenbanktest-Frameworks wie DbUnit ein und überprüfen Sie ihn. Externe API-/Webdiensttests: Verwenden Sie eine HTTP-Clientbibliothek, um Interaktionen zu simulieren, indem Sie einen lokalen oder Stub-Server in der Testumgebung verwenden.
Häufig gestellte Fragen zum PHP-Unit-Testen
Frage 1: Wie teste ich Code mit externen Abhängigkeiten?
Lösung: Verwenden Sie ein Spott-Framework wie Mockery oder Prophecy von PHPUnit, mit dem Sie gefälschte Abhängigkeitsobjekte erstellen und Aussagen über deren Interaktionen treffen können.
use Prophecy\Prophet; class UserRepoTest extends \PHPUnit\Framework\TestCase { public function testFetchUser(): void { $prophet = new Prophet(); $cache = $prophet->prophesize(Cache::class); $userRepo = new UserRepo($cache->reveal()); $actualUser = $userRepo->fetchUser(1); $cache->get(1)->shouldHaveBeenCalled(); $this->assertEquals($expectedUser, $actualUser); } }
Frage 2: Wie teste ich eine private Methode oder Eigenschaft?
Lösung: Verwenden Sie Reflection-APIs (wie ReflectionClass
und ReflectionMethod
), die Ihnen den Zugriff auf private Mitglieder ermöglichen. Dies kann jedoch die Wartung von Tests erschweren. ReflectionClass
和 ReflectionMethod
),允许你访问私有成员。然而,它可能会使测试难以维护。
另一种解决方案是使用测试特定的可见性修饰符,例如 PHPUnit 的 @protected
@protected
von PHPUnit. class UserTest extends \PHPUnit\Framework\TestCase { public function testPasswordIsSet(): void { $user = new User(); $reflector = new ReflectionClass($user); $property = $reflector->getProperty('password'); $property->setAccessible(true); $property->setValue($user, 'secret'); $this->assertEquals('secret', $user->getPassword()); } }
Lösung:
Verwenden Sie ein Datenbanktest-Framework wie DbUnit oder Doctrine DBAL Assertions von PHPUnit, mit dem Sie den Datenbankstatus festlegen und überprüfen können.use PHPUnit\DbUnit\TestCase; class PostRepoTest extends TestCase { protected function getConnection(): Connection { return $this->createDefaultDBConnection(); } public function testCreatePost(): void { $dataset = $this->createXMLDataSet(__DIR__ . '/initial-dataset.xml'); $this->getDatabaseTester()->setDataSet($dataset); $this->getDatabaseTester()->onSetUp(); $post = new Post(['title' => 'My First Post']); $postRepo->persist($post); $postRepo->flush(); $this->assertTrue($this->getConnection()->getRowCount('posts') === 1); } }
Lösung:
Verwenden Sie eine HTTP-Client-Bibliothek, um Interaktionen mit externen Diensten zu simulieren. In einer Testumgebung können Sie einen lokalen Server oder einen Stub-Server verwenden. 🎜use GuzzleHttp\Client; class UserServiceTest extends \PHPUnit\Framework\TestCase { public function testFetchUser(): void { $httpClient = new Client(); $userService = new UserService($httpClient); $httpClient ->shouldReceive('get') ->with('/users/1') ->andReturn(new Response(200, [], json_encode(['id' => 1, 'name' => 'John Doe']))); $user = $userService->fetchUser(1); $this->assertInstanceOf(User::class, $user); $this->assertEquals(1, $user->getId()); } }
Das obige ist der detaillierte Inhalt vonHäufige Probleme und Lösungen in der PHP-Unit-Testing-Praxis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!