public function execute(RegisterUserAction $action)
 {
     $username = new Username($action->getUsername());
     $password = $action->getPassword();
     $email = new Email($action->getEmail());
     $displayName = new Name($action->getDisplayName());
     $preferredLocale = Locale::parse($action->getPreferredLocale());
     $user = $this->userRepository->createNew($username);
     $user->setName($displayName)->setEmail($email)->setPreferredLocale($preferredLocale);
     $encoder = $this->encoderFactory->getEncoder($user);
     $salt = md5(uniqid(null, true));
     $password = $encoder->encodePassword($password, $salt);
     $credentials = $this->credentialsRepository->createNew($user, $password, $salt);
     $this->userRepository->save($user);
     $this->credentialsRepository->save($credentials);
     return $user;
 }
 function it_execute_action(UserRepository $userRepository, CredentialsRepository $credentialsRepository, EncoderFactoryInterface $encoderFactory, EventDispatcherInterface $eventDispatcher, PasswordEncoderInterface $passwordEncoder, User $user, Credentials $credentials, RegisterUserAction $action)
 {
     // Mocks
     $action->getUsername()->willReturn('mattketmo');
     $action->getDisplayName()->willReturn('Matthieu Moquet');
     $action->getEmail()->willReturn('*****@*****.**');
     $action->getPassword()->willReturn('super_passw0rd');
     $action->getPreferredLocale()->willReturn('fr_FR');
     $encoderFactory->getEncoder($user)->willReturn($passwordEncoder);
     $passwordEncoder->encodePassword('super_passw0rd', Argument::type('string'))->willReturn('encoded_password==');
     $userRepository->createNew(Argument::exact(new Username('mattketmo')))->willReturn($user);
     $credentialsRepository->createNew($user, 'encoded_password==', Argument::type('string'))->shouldBeCalled()->willReturn($credentials);
     $user->setName(Argument::exact(new Name('Matthieu Moquet')))->shouldBeCalled()->willReturn($user);
     $user->setEmail(Argument::exact(new Email('*****@*****.**')))->shouldBeCalled()->willReturn($user);
     $user->setPreferredLocale(Argument::exact(Locale::parse('fr_FR')))->shouldBeCalled()->willReturn($user);
     $userRepository->save($user)->shouldBeCalled();
     $credentialsRepository->save($credentials)->shouldBeCalled();
     $this->execute($action)->shouldReturn($user);
 }