PHPUnit тест для метода, который отправляет электронную почту один раз - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь написать какой-то модульный тест, в котором я могу проверить, не должен ли создатель сообщения дважды получать одно и то же электронное письмо.

Я новичок в тестировании (не новый в Symfony.) basi c test, и они работают.

Во-первых, проблема заключается в том, что это метод внутри класса DataPersister внутри платформы Api, который вызывается каждый раз, когда сущность сохраняется и отправляет электронное письмо пользователю.

final class EmailDataPersister 
{
   public function persist($data, array $context = [])
   {
    $result = $this->decorated->persist($data, $context);

    if (
        $data instanceof User&& (
            ($context['collection_operation_name'] ?? null) === 'post')
    ) {
        $this->sendEmail($data);
    }

    return $result;
}
    private function sendEmail(User $user)
    {
        $email = (new EmailNotification())
            ->setTitle('Hello ' . $user->getName())
            ->setFrom('sender@sent.com')
            ->setAddress($user->getEmail)
            ->setBody('This is a new email');
        $this->messageBus->dispatch($email);
    }
 }

Пробовал что-то вроде:

class someModelTest extends TestCase

  public function testEmails()
{
    $this->satEmail('test@pmg.co');

    $this->assertMessageCount(1, 'should have sent one email');

    $msg = $this->getMessages()[0];

    $this->assertArrayHasKey('test@pmg.co', $msg->getTo());
}

public function satEmail($email)
{
    $msg = (new \Swift_Message('Testing..'))
        ->setSubject('Hello')
        ->setBody('Hello')
        ->setFrom('helle@example.com')
        ->setTo($email);

    $this->mailer->send($msg);
}

Думаю, мне нужно добавить ..

        $model = $this->getMock('someModel', array('setFrom', 'setTo', 'setSubject', 'send'));
        $controller->expects($this->once())
            ->method('setFrom');
        $controller->expects($this->once())
            ->method('setTo');
        $controller->expects($this->once())
            ->method('setSubject');
        $controller->expects($this->once())
            ->method('send');
        $model->sendEmail();
    }

I не могу понять, должен ли я вызывать этот метод внутри класса или что я должен определить контроллер модели et c?

...