Symfony 6 프로젝트의 사용자 정의 클래스에서 Symfony 메일러를 사용하고 있습니다. 나는 다음과 같이 클래스 생성자에서 유형 힌트를 통해 자동 배선을 사용하고 있습니다.
으아아아컨트롤러에서 sendEmail()
메소드를 호출하면 모든 것이 잘 작동합니다.
이제 TransportException
s 是否被正确处理。为此,我需要邮件程序在我的测试中抛出 TransportException
를 테스트하고 싶습니다. 그러나 이것은 내가 바라던 대로 작동하지 않았습니다.
참고 : sendMail
메소드는 유효한 이메일 주소만 허용하기 때문에 잘못된 이메일 주소를 전달하여 예외를 발생시킬 수 없습니다.
내가 시도한 것:
1) 시뮬레이션 이메일 프로그램 사용
으아아아시뮬레이트할 수 없다는 사실이 밝혀졌습니다 Mailer
类,因为它是 final
.
2) 모의(또는 스텁) MailerInterface를 사용하세요
으아아아오류는 없지만 예외가 발생하지 않습니다. 메일 서비스가 대체되지 않은 것 같습니다.
3) 사용자 정의 MailerExceptionTester 클래스를 사용하세요
으아아아테스트 중:
으아아아2)와 같은 결과
4) Mailer 대신 MailerInterface 서비스를 변경해 보세요
으아아아오류 메시지: SymfonyComponentDependencyInjectionExceptionInvalidArgumentException:“SymfonyComponentMailerMailerInterface”服务是私有的,您无法替换它。
5) MailerInterface를 공개로 설정합니다
으아아아错误:无法实例化接口 SymfonyComponentMailerMailerInterface
6) MailerInterface
에 대한 별칭 추가 으아아아오류 메시지: SymfonyComponentDependencyInjectionExceptionInvalidArgumentException:“SymfonyComponentMailerMailerInterface”服务是私有的,您无法替换它。
테스트에서 자동으로 연결된 MailerInterface
서비스를 어떻게 교체하나요?
첫 번째 시도에서는 순서가 정확해야 합니다.
으아악테스트되지 않았지만 클래스를 객체로 가져오고 있으므로 조롱하기 전에 서비스에 대한 종속성이 이미 해결되었습니다. 먼저 컨테이너의 서비스를 교체한 다음 컨테이너에서
MyClass
를 가져와야 합니다.그러나 컨테이너 빌드를 완전히 건너뛸 수도 있습니다. PhpUnit을 사용하면 됩니다.
으아악저는 이 작업을 시도하고 있으며 귀하가 이미 시도한 내용을 바탕으로 해결책을 찾았다고 믿습니다.
내
으아아아services.yaml
中,我重新声明mailer.mailer
서비스에서 테스트 환경에서 공개로 설정합니다.이 설정을 사용하면 Symfony Mailer 서비스가 이전과 정확히 동일한 방식으로 작동하지만 이제 공개되었기 때문에 필요한 경우 컨테이너에서 사용하는 클래스를 재정의할 수 있습니다.
당신이 작성한 사용자 정의 메일러 클래스를 복사했습니다...
으아아아...내 테스트 코드에서 테스트 컨테이너를 가져와서
으아아아mailer.mailer
서비스를 예외 발생 클래스의 인스턴스로 대체했습니다.이제 메일러 서비스를 주입할 때마다 사용되는 클래스는 사용자 정의 예외 발생 클래스가 됩니다!