বেশিরভাগ সময়, মেমরির ডাটাবেস টেস্টিং উপহাসের চেয়ে সহজ। এটি আরও অনেক নমনীয়। এবং এটি মাইগ্রেশন ফাইলগুলি ভালভাবে সম্পন্ন করার পরীক্ষা করে (যখন মাইগ্রেশন ফাইল থাকে)।
এই ছদ্ম কোডটি দেখুন:
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
) ব্যবহার করে এবং তারপরে এটির বিরুদ্ধে দৃser়তা দেয়। আপনি যদি প্রয়োগটি পরিবর্তন করেন তবে এই পরীক্ষাটি ভাঙবে না তবে এটি ধীর।
ইতিমধ্যে, 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;
}
}
এই উপায়টি আরও উদ্বেগপূর্ণ, পড়তে সহজ এবং বোঝার পক্ষে সহজ এবং এটি কোডের উচ্চ স্তরগুলিতে প্রকৃত ডেটাবেস বাস্তবায়নের উপর নির্ভর করে না।