未发送预期的 [App\Mail\WelcomeEmail] 可邮寄。无法断言 false 为 true

Posted

技术标签:

【中文标题】未发送预期的 [App\\Mail\\WelcomeEmail] 可邮寄。无法断言 false 为 true【英文标题】:The expected [App\Mail\WelcomeEmail] mailable was not sent. Failed asserting that false is true未发送预期的 [App\Mail\WelcomeEmail] 可邮寄。无法断言 false 为 true 【发布时间】:2020-10-09 16:50:19 【问题描述】:

我在哪里犯错了?打击代码不适用于测试。 找到用户。不存在user null之类的问题。

错误信息是:

The expected [App\Mail\WelcomeEmail] mailable was not sent. Failed asserting that false is true.

   at vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/MailFake.php:64
  60|         
  61| 
  62|         PHPUnit::assertTrue(
  63|             $this->sent($mailable, $callback)->count() > 0,
> 64|             $message
  65|         );
  66|     
  67| 

测试类

class MailTest extends TestCase

    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testWelcomeMail()
    
        $this->withoutExceptionHandling();
        Mail::fake();

        Mail::assertSent(WelcomeEmail::class);
    

邮件类

class WelcomeEmail extends Mailable

 use Queueable, SerializesModels;

 public $data;

 public function __construct($data)
 
    $this->data = $data;
 

 public function build()
 
    $user = User::find(3425);

    $address = 'myjourney@asdasd.com';
    $subject = __('email.welcome_to_journey');
    $name = __('email.my_journey');

    if ($user != NULL) 
        \App::setLocale($user->lang);
        $user->is_welcome_email_sent = 1;
        $user->save();

    

    return $this->view('email.user_welcome', ['user' => $user])
        ->from($address, $name)
        // ->cc($address, $name)
        // ->bcc($address, $name)
        ->replyTo($address, $name)
        ->subject($subject);
 

我可以处理其他测试文件,例如登录、注册等,但不能邮寄。

【问题讨论】:

你好...请不要放代码图片,代码是文字 【参考方案1】:

真的有一个 ID 为 3425 的用户吗?

$user = User::find(3425);

您的代码可能会在此处中断,因为我们无法从空对象检索 lang。该行可能应该被删除,因为它已经用在您检查用户是否存在的更下方的行中。

\App::setLocale($user->lang); 

您的电子邮件模板似乎也使用来自 $user 的数据,因为用户对象已传递给模板。如果您希望用户存在,这也可能会中断。

【讨论】:

id 属于实际用户。正常情况下,代码在项目中运行 您在进行测试时是否使用相同的数据库?您的测试类正在使用 RefreshDatabase,它在测试时清除您的数据库。除非我弄错了,否则如果您在测试开始时没有添加用户,则应该没有用户。 是的,我正在使用同一个数据库来测试它。我已经有另一个使用 creadianials 登录的测试类,它可以工作。【参考方案2】:

您没有将电子邮件与其他凭据一起发送。你的函数应该是这样的

public function testWelcomeMail()

    $this->withoutExceptionHandling();
    Mail::fake();
    Mail::to('<email_address>')->send(new WelcomeEmail(['user' => <some_number>]));
    Mail::assertSent(WelcomeEmail::class);

【讨论】:

以上是关于未发送预期的 [App\Mail\WelcomeEmail] 可邮寄。无法断言 false 为 true的主要内容,如果未能解决你的问题,请参考以下文章

App Store Connect Sandbox 服务器到服务器通知未发送预期字段

阅读电子邮件的 html 模板未按预期显示

Firebase 云函数 - 返回未定义、预期的 Promise 或值

使用 discordJDA 等待消息未按预期工作

函数返回未定义,预期Promise或值和通知长时间延迟

MongoDB 作为接收器连接器未按预期捕获数据 - kafka?