Sobes.tech
Middle

Kas ir mock un stub? Kā tie atšķiras?

sobes.tech AI

Atbilde no AI

Moki un stabji ir testēšanas dubļi — tie ir testēšanas dubļi, kas tiek izmantoti moduļu testēšanā, lai imitētu reālo atkarību uzvedību.

Stabs (Stub):

  • Nodrošina "aizstājēja" uzvedību testēšanas scenārijam.
  • Atbild uz metožu izsaukumiem, atgriežot iepriekš noteiktas vērtības.
  • Nepārbauda mijiedarbības. Tā mērķis ir nodrošināt testējamam objektam datus turpmākai darbībai.

Moks (Mock):

  • Ir līdzīgs stabam, bet ar pievienotu mijiedarbības pārbaudes loģiku.
  • Satur gaidījumus par to, kuras metodes jāizsauc, cik reižu un ar kādiem argumentiem.
  • Tests pārbauda ne tikai rezultātu, bet arī pareizību mijiedarbībā ar moku.
<?php
// Moka piemērs
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()) // Gaidām vienu izsaukumu
                     ->method('getUserById')
                     ->with(1) // Gaidāms arguments 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Gaidāmās atgrieztās vērtības

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

        // Rezultāta un mijiedarbības pārbaude ar moku
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Tabulas atšķirības:

Īpašība Stabs (Stub) Moks (Mock)
Mērķis Nodrošināt datus darbam Pārbaudīt mijiedarbību un datus
Pārbaude Nepārbauda mijiedarbības Pārbauda, kā objekts darbojas ar to
Uzvedība Vienkārši atgriež vērtības Satur gaidījumus par izsaukumiem
Kas veic assert Testējamais objekts vai klients Pašs moks (caur gaidījumiem)