Heim  >  Artikel  >  Backend-Entwicklung  >  Häufige Probleme und Lösungen in der PHP-Unit-Testing-Praxis

Häufige Probleme und Lösungen in der PHP-Unit-Testing-Praxis

PHPz
PHPzOriginal
2024-05-06 12:42:011158Durchsuche

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.

PHP 单元测试实践中的常见问题与解决方案

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. ReflectionClassReflectionMethod),允许你访问私有成员。然而,它可能会使测试难以维护。

另一种解决方案是使用测试特定的可见性修饰符,例如 PHPUnit 的 @protected

Eine andere Lösung besteht darin, einen testspezifischen Sichtbarkeitsmodifikator zu verwenden, wie z. B. @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());
    }
}
Frage 3: Wie teste ich die Datenbankinteraktion?

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);
    }
}
Frage 4: Wie teste ich Code, der auf externen APIs oder Webdiensten basiert?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn