Heim > Backend-Entwicklung > PHP-Tutorial > 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
Freigeben: 2024-05-06 12:42:01
Original
1205 Leute haben es durchsucht

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);
    }
}
Nach dem Login kopieren

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());
    }
}
Nach dem Login kopieren
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);
    }
}
Nach dem Login kopieren
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());
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage