Sobes.tech
Middle

Τι είναι τα mocks και τα stubs; Πώς διαφέρουν;

sobes.tech AI

Απάντηση από AI

Mocks και stubs είναι τύποι δοκιμαστικών διπλότυπων που χρησιμοποιούνται στις μονάδες δοκιμών για την προσομοίωση της συμπεριφοράς των πραγματικών εξαρτήσεων του αντικειμένου.

Stub:

  • Παρέχει μια "σταθερή" συμπεριφορά για ένα σενάριο δοκιμής.
  • Απαντά σε κλήσεις μεθόδων επιστρέφοντας προκαθορισμένες τιμές.
  • Δεν ελέγχει την αλληλεπίδραση, ο στόχος του είναι να παρέχει δεδομένα ώστε το δοκιμαζόμενο αντικείμενο να συνεχίσει.
<?php
// Παράδειγμα αντικειμένου stub
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Προσομοίωση της επιστρεφόμενης τιμής για συγκεκριμένο ID
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

Mock:

  • Παρόμοιο με το stub, αλλά με λογική ελέγχου της αλληλεπίδρασης.
  • Περιέχει προσδοκίες σχετικά με το ποια methods πρέπει να καλούνται, πόσες φορές και με ποια επιχειρήματα.
  • Η δοκιμή ελέγχει όχι μόνο το αποτέλεσμα, αλλά και τη σωστή αλληλεπίδραση με το mock.
<?php
// Παράδειγμα mock αντικειμένου
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;

class UserServiceTest extends TestCase {
    public function testGetUserByIdCallsDatabase(): void {
        $databaseMock = $this->createMock(Database::class);
        $databaseMock->expects($this->once()) // Αναμένουμε μία κλήση
                     ->method('getUserById')
                     ->with(1) // Αναμένουμε το όρισμα 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Αναμενόμενη επιστρεφόμενη τιμή

        $userService = new UserService($databaseMock);
        $user = $userService->getUserById(1);

        // Έλεγχος αποτελέσματος και αλληλεπίδρασης
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Πίνακας σύγκρισης:

Χαρακτηριστικό Stub Mock
Σκοπός Παροχή δεδομένων για δοκιμή Έλεγχος αλληλεπίδρασης και δεδομένων
Έλεγχος Δεν ελέγχει την αλληλεπίδραση Ελέγχει πώς λειτουργεί το αντικείμενο με αυτό
Λογική συμπεριφοράς Απλώς επιστρέφει τιμές Περιέχει προσδοκίες κλήσεων
Ποιος κάνει assert Το δοκιμαζόμενο αντικείμενο ή ο πελάτης Ο ίδιος ο mock (μέσω προσδοκιών)