Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ stop και mock;

sobes.tech AI

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

stop — είναι μια τεχνική απομόνωσης της δοκιμής από άμεσες εξαρτήσεις (π.χ., κλήσεις σε εξωτερικά API, βάσεις δεδομένων) με την αντικατάσταση των πραγματικών αντικειμένων από δοκιμαστικά ψεύτικα αντικείμενα. Χρησιμοποιείται για τον έλεγχο της συμπεριφοράς των εξωτερικών εξαρτήσεων και την εξασφάλιση επαναληψιμότητας των δοκιμών.

mock (παράγωγο του "mock object") — είναι μια ποικιλία δοκιμαστικού ψεύτικου αντικειμένου που όχι μόνο αντικαθιστά το πραγματικό αντικείμενο, αλλά και επιτρέπει τον έλεγχο του πώς αλληλεπιδρά ο κώδικας που δοκιμάζεται με αυτό. Με τα mocks, μπορούμε να δηλώσουμε (assert) σχετικά με τις κλήσεις μεθόδων, τα επιχειρήματά τους και τον αριθμό των κλήσεων.

Έτσι, το stop είναι μια πιο γενική έννοια που περιγράφει την απομόνωση, και το mock είναι ένα συγκεκριμένο εργαλείο για την επίτευξή της, που προσθέτει τη δυνατότητα επαλήθευσης της αλληλεπίδρασης.

Παράδειγμα με PHPUnit και Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Κλάση που χρησιμοποιεί μια εξωτερική εξάρτηση
class UserProcessor
{
    private $apiClient;

    public function __construct(ApiClient $apiClient)
    {
        $this->apiClient = $apiClient;
    }

    public function processUserData(int $userId): bool
    {
        $data = $this->apiClient->fetchUserData($userId);

        if ($data && $data['status'] === 'active') {
            // Λογική επεξεργασίας ενεργού χρήστη
            return true;
        }
        return false;
    }
}

// Παράδειγμα χρήσης mock για δοκιμές
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Δημιουργία mock για ApiClient
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Ορισμός αναμενόμενης συμπεριφοράς για το mock
        // Αναμένουμε κλήση της μεθόδου fetchUserData με όρισμα 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Το mock επιστρέφει αυτά τα δεδομένα
                      ->once(); // Αναμένουμε ότι η μέθοδος θα κληθεί ακριβώς μία φορά

        // Δημιουργία του αντικειμένου δοκιμής, περνώντας το mock
        $userProcessor = new UserProcessor($apiClientMock);

        // Εκτέλεση της δοκιμαστικής μεθόδου
        $result = $userProcessor->processUserData(123);

        // Έλεγχος αποτελέσματος
        $this->assertTrue($result);

        // Έλεγχος ότι όλες οι προσδοκίες του mock εκπληρώθηκαν
        Mockery::close();
    }
}

Σε αυτό το παράδειγμα, το ApiClient αντικαθίσταται με ένα "mock". Έχουμε "ψεύτικα" την πραγματική κλήση API και έχουμε διαμορφώσει το mock να επιστρέφει συγκεκριμένα δεδομένα όταν καλείται το fetchUserData(123). Επίσης, επαληθεύουμε ότι αυτή η μέθοδος καλείται με τα σωστά επιχειρήματα και μία φορά. Αυτή είναι η βασική διαφορά: το mock επιτρέπει την επαλήθευση της αλληλεπίδρασης.