>  Q&A  >  본문

다시 작성된 제목은 다음과 같습니다. 테스트 목적으로 Symfony 메일러를 어떻게 시뮬레이션할 수 있습니까?

Symfony 6 프로젝트의 사용자 정의 클래스에서 Symfony 메일러를 사용하고 있습니다. 나는 다음과 같이 클래스 생성자에서 유형 힌트를 통해 자동 배선을 사용하고 있습니다.

으아아아

컨트롤러에서 sendEmail() 메소드를 호출하면 모든 것이 잘 작동합니다.

이제 TransportExceptions 是否被正确处理。为此,我需要邮件程序在我的测试中抛出 TransportException를 테스트하고 싶습니다. 그러나 이것은 내가 바라던 대로 작동하지 않았습니다.

참고 : sendMail 메소드는 유효한 이메일 주소만 허용하기 때문에 잘못된 이메일 주소를 전달하여 예외를 발생시킬 수 없습니다.

내가 시도한 것:

1) 시뮬레이션 이메일 프로그램 사용

으아아아

시뮬레이트할 수 없다는 사실이 밝혀졌습니다 Mailer 类,因为它是 final.

2) 모의(또는 스텁) MailerInterface를 사용하세요

으아아아

오류는 없지만 예외가 발생하지 않습니다. 메일 서비스가 대체되지 않은 것 같습니다.

3) 사용자 정의 MailerExceptionTester 클래스를 사용하세요

으아아아

테스트 중:

으아아아

2)와 같은 결과

4) Mailer 대신 MailerInterface 서비스를 변경해 보세요

으아아아

오류 메시지: SymfonyComponentDependencyInjectionExceptionInvalidArgumentException:“SymfonyComponentMailerMailerInterface”服务是私有的,您无法替换它。

5) MailerInterface를 공개로 설정합니다

으아아아

错误:无法实例化接口 SymfonyComponentMailerMailerInterface

6) MailerInterface

에 대한 별칭 추가 으아아아

오류 메시지: SymfonyComponentDependencyInjectionExceptionInvalidArgumentException:“SymfonyComponentMailerMailerInterface”服务是私有的,您无法替换它。

테스트에서 자동으로 연결된 MailerInterface 서비스를 어떻게 교체하나요?

P粉739706089P粉739706089281일 전458

모든 응답(2)나는 대답할 것이다

  • P粉704066087

    P粉7040660872023-12-14 00:55:20

    첫 번째 시도에서는 순서가 정확해야 합니다.

    으아악

    테스트되지 않았지만 클래스를 객체로 가져오고 있으므로 조롱하기 전에 서비스에 대한 종속성이 이미 해결되었습니다. 먼저 컨테이너의 서비스를 교체한 다음 컨테이너에서 MyClass를 가져와야 합니다.

    그러나 컨테이너 빌드를 완전히 건너뛸 수도 있습니다. PhpUnit을 사용하면 됩니다.

    으아악

    회신하다
    0
  • P粉226667290

    P粉2266672902023-12-14 00:54:16

    저는 이 작업을 시도하고 있으며 귀하가 이미 시도한 내용을 바탕으로 해결책을 찾았다고 믿습니다.

    services.yaml 中,我重新声明 mailer.mailer 서비스에서 테스트 환경에서 공개로 설정합니다.

    으아아아

    이 설정을 사용하면 Symfony Mailer 서비스가 이전과 정확히 동일한 방식으로 작동하지만 이제 공개되었기 때문에 필요한 경우 컨테이너에서 사용하는 클래스를 재정의할 수 있습니다.

    당신이 작성한 사용자 정의 메일러 클래스를 복사했습니다...

    으아아아

    ...내 테스트 코드에서 테스트 컨테이너를 가져와서 mailer.mailer 서비스를 예외 발생 클래스의 인스턴스로 대체했습니다.

    으아아아

    이제 메일러 서비스를 주입할 때마다 사용되는 클래스는 사용자 정의 예외 발생 클래스가 됩니다!

    회신하다
    0
  • 취소회신하다