अधिकांश समय, इन-मेमोरी डेटाबेस परीक्षण मॉकिंग की तुलना में सरल होता है। यह और भी अधिक लचीला है। और यह भी परीक्षण करता है कि माइग्रेशन फाइलें अच्छी तरह से की जाती हैं (जब माइग्रेशन फाइलें होती हैं)।
इस छद्म कोड को देखें:
class InMemoryTest
{
/** @test */
public function user_repository_can_create_a_user()
{
$this->flushDatabase();
$userRepository = new UserRepository(new Database());
$userRepository->create('name', 'email@email.com');
$this->seeInDatabase('users', ['name' => 'name', 'email' => 'email@email.com']);
}
}
class MockingDBTest
{
/** @test */
public function user_repository_can_create_a_user()
{
$databaseMock = MockLib::mock(Database::class);
$databaseMock->shouldReceive('save')
->once()
->withArgs(['users', ['name' => 'name', 'email' => 'email@email.com']]);
$userRepository = new UserRepository($databaseMock);
$userRepository->create('name', 'email@email.com');
}
}
यह इस InMemoryTest
बात पर निर्भर नहीं करता है कि कैसे काम Database
में लागू किया UserRepository
जाता है। यह बस UserRepository
सार्वजनिक इंटरफ़ेस ( create
) का उपयोग करता है और फिर इसके खिलाफ दावा करता है। यदि आप कार्यान्वयन को बदलते हैं तो यह परीक्षा नहीं टूटेगी लेकिन यह धीमी है।
इस बीच, MockingDBTest
कैसे Database
लागू किया जाता है पर पूरी तरह से निर्भर करता है UserRepository
। वास्तव में, यदि आप कार्यान्वयन को बदलते हैं, लेकिन फिर भी इसे दूसरे तरीके से काम करते हैं, तो यह परीक्षा टूट जाएगी।
दोनों दुनिया के सर्वश्रेष्ठ इंटरफ़ेस को लागू करने वाले नकली का उपयोग करेंगे Database
:
class UsingAFakeDatabaseTest
{
/** @test */
public function user_repository_can_create_a_user()
{
$fakeDatabase = new FakeDatabase();
$userRepository = new UserRepository($fakeDatabase);
$userRepository->create('name', 'email@email.com');
$this->assertEquals('name', $fakeDatabase->datas['users']['name']);
$this->assertEquals('email@email.com', $fakeDatabase->datas['users']['email']);
}
}
interface DatabaseInterface
{
public function save(string $table, array $datas);
}
class FakeDatabase implements DatabaseInterface
{
public $datas;
public function save(string $table, array $datas)
{
$this->datas[$table][] = $datas;
}
}
यह अधिक अभिव्यंजक है, पढ़ने में आसान और समझने में आसान है, और यह कोड की उच्च परतों में किए गए वास्तविक डेटाबेस के कार्यान्वयन पर निर्भर नहीं करता है।