Wzorce projektowe w praktyce - rejestracja użytkownika
2015-09-24
Obecnie praktycznie każdy system posiada mniej lub bardziej rozbudowany mechanizm rejestracji kont użytkowników. Nie inaczej było też w przypadku, w którym jeden z programistów poprosił o pomoc na irc. Problem przedstawiał się następująco: programista tworzył mechanizm rejestracji użytkownika, dane kont przechowywał w bazie danych, do obsługi bazy postanowił skorzystać z Doctrine natomiast testy jednostkowe pisał przy użyciu PHPSpec.
Dobór narzędzi bardzo standardowy jak na obecne czasy i za razem bardzo trafiony, gdyż PHPSpec praktycznie od razu powiedział mu, że coś robi źle. Problem w tym, że on tego przekazu nie potrafił zrozumieć i myślał, że popełnił błąd w specyfikacji.
Po kilku zdaniach wstępu pokazał specyfikację usługi rejestrującej użytkownika, w zasadzie tylko jednego scenariusza tej specyfikacji, mianowicie "poprawna rejestracja nowego konta".
class RegistrationServiceSpec extends ObjectBehavior
{
function it_registers_user(Registry $doctrine, EntityManager $entityManager, Form $form)
{
$doctrine->getEntityManager()->willReturn($entityManager);
$form->getData()->willReturn(['username' => 'norzechowicz', 'password' => 'pass123']);
$entityManager->persist(Argument::type('Custom\Entity\User'))->shouldBeCalled();
$entityManager->flush()->shouldBeCalled();
$this->register($form)->shouldReturn(true);
}
}
Ten kod nie działa.
Powyższą specyfikację spełniać miał poniższy kawałek kodu.