메일을 보낼 때 Laavel을 사용한 속성 할당

12070 단어 LaravelTestmailtech

배경.


mocking#mail-fake에서 보듯이 목적지는 분배될 수 있지만 다른 속성, 예를 들어 테마, 템플릿 등도 분배되어야 한다.誰が、誰に、何の件名で、どのテンプレートを使って 메일 보냈어요?

컨디션


Laravel: 8.24

컨텐트


일반 메일에 포함된 속성을 대상으로 합니다.객체 등록 정보는 다음과 같습니다.
  • From
  • To
  • Subject
  • View
  • 다음은 Mailable 클래스를 상속받은 클래스의 예입니다.
    mail.php
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('[email protected]')
                    ->markdown('emails.orders.shipped', [
                        'url' => $this->orderUrl,
                    ])
    		->subject('example subject');
    }
    
    부분적으로 발췌한 테스트 코드는 다음과 같다.
    mailTest.php
    <?php
    
    namespace Tests;
    
    use App\Mail\OrderShipped;
    use Illuminate\Mail\Markdown;
    use Illuminate\Support\Facades\Mail;
    use Tests\TestCase;
    use ReflectionClass;
    
    class ExampleTest extends TestCase
    {
        public function test_orders_can_be_shipped()
        {
            Mail::fake();
    
            // Perform sending email
    
            // Assert that a mailable with attributes sent
            Mail::assertSent($mailable, function ($mail) use ($data) {
                $mail->build();
                $reflectionClass = new ReflectionClass($mail);
                $reflectionProperty = $reflectionClass->getProperty('markdown');
                $reflectionProperty->setAccessible(true);
                $view = $reflectionProperty->getValue($mail);
    	    
                $markdown = $this->app->make(Markdown::class);
                $body = $markdown->renderText($view, $mail->buildViewData());
    
                $this->assertSame($mail->viewData, $data['viewData']);
    
                return $mail->hasFrom($data['from'])
    	        $mail->hasTo($data['to']) &&
                    $mail->subject == $data['subject'] &&
                    $view == $data['view'] &&
                    ($body) &&
                    strpos($body, $data['needle']);
        }
    }
    
  • Mailale류의 보기 템플릿은proteted의 속성이기 때문에 고육의 전략Reflection 참조입니다.
  • markdown 속성에 지정된 템플릿의 유효성은 needle의 문자열 검색을 통해 보장됩니다.(메시지의 레이아웃과 내용이 완전히 일치하여 테스트 관점에 포함되지 않음)
  • viewData는 연상 배열 형식으로 용례 항목의 명칭에 따라 변할 수 있기 때문에 사용assertSame.
  • 주의점

  • From 속성이 전역 설정인 경우 실행build() 시 바인딩되지 않으므로 결단을 내릴 수 없습니다.
  • 참고 자료

  • mail
  • mocking#mail-fake
  • https://github.com/laravel/ideas/issues/405
  • 좋은 웹페이지 즐겨찾기