Çoğu zaman, bellek içi veritabanı testi alaydan daha basittir. Aynı zamanda çok daha esnektir. Ayrıca, geçiş dosyalarının iyi yapıldığını da test eder (geçiş dosyaları olduğunda).
Bu sahte kodu görün:
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');
}
}
Bu InMemoryTest, işe nasıl Databaseuygulandığına bağlı değildir UserRepository. Sadece UserRepositorygenel arabirimi ( create) kullanır ve sonra ona karşı ekler. Uygulamayı değiştirirseniz bu test kırılmaz ancak daha yavaştır.
Bu arada, MockingDBTestnasıl Databaseuygulandığına tamamen güvenir UserRepository. Aslında, uygulamayı değiştirir ancak yine de başka bir şekilde çalıştırırsanız, bu test kırılır.
Her iki dünyanın en iyisi , arayüzü uygulayan sahte bir yöntem kullanmaktır 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;
}
}
Bu çok daha etkileyici, okunması ve anlaşılması daha kolaydır ve kodun daha üst katmanlarında yapılan gerçek Veritabanının uygulanmasına bağlı değildir.