如何对 Laravel Mailable 进行断言

2024-05-08

在测试中,我想使用以下方法对 Mailable 做出一些断言Mail::assertSent(), 像这样:

Mail::assertSent(MyMailable::class, function ($mail) use ($user) {
    return $mail->hasTo($user->email);
});

到目前为止,我已经找到了hasTo(), hasFrom(), hasBcc()和所有其他的has*()方法效果很好。但是,当断言 Mailable 存在特定属性时,例如subject该属性显示为 null 并且断言失败:

Mail::assertSent(MyMailable::class, function ($mail) {
    return $mail->subject === 'My Subject';
});

我相信这是因为我已经配置了所有可邮寄属性build()在断言阶段可能尚未调用该方法,因此尚未在对象上设置属性。

我想使用build()方法是根据文档采取的正确方法:

可邮寄类的所有配置都是在构建方法中完成的。在此方法中,您可以调用各种方法(例如 from、subject、view 和 Attach)来配置电子邮件的呈现和传递。

https://laravel.com/docs/5.5/mail#writing-mailables https://laravel.com/docs/5.5/mail#writing-mailables

我发现当我在构造函数上设置属性时,我可以获得 Mailable 属性的断言:

class MyMail extends Mailable
{
    public function __construct()
    {
        $this->subject = 'My Subject';
    }

    public function build() {
        return $this->subject('My Subject')->view('emails/my-email')
    }
}

但是,我觉得这种方法是错误的,因为我觉得我正在更改代码以适应我的测试。

所以,我想知道是否有更好的方法来对 Mailable 上的属性进行断言?任何帮助将不胜感激,谢谢!

EDIT 1

测试类(去掉无关代码)

/** @test */
function a_notification_is_sent_when_an_application_is_updated()
{
    Mail::fake([RequiresVerification::class]);

    // some set up and factory methods called here...

    // the listener for this event sends mail
    ApplicationUpdated::dispatch($application);

    // this assertion passes
    Mail::assertSent(RequiresVerification::class);

    // this assertion does not pass when subject is set on the build()  
    // method but passes when subject is set on the constructor
    Mail::assertSent(RequiresVerification::class, function ($mail) use ($user) {
        return $mail->subject === 'hello';
    });
}

EDIT 2

我目前正在查看hasRecipient() method https://github.com/laravel/framework/blob/5.5/src/Illuminate/Mail/Mailable.php#L540,其中所有has*方法使用,看看它如何处理针对我假设的可邮寄属性(to、from、bcc、cc 等)进行断言。也许可以使用类似的方法扩展 Mailable 对象以添加新的属性断言?

https://github.com/laravel/framework/blob/5.5/src/Illuminate/Mail/Mailable.php#L540 https://github.com/laravel/framework/blob/5.5/src/Illuminate/Mail/Mailable.php#L540


您可以针对配置中的属性进行断言build()方法通过调用build()内的方法assertSent在做出断言之前关闭:

Mail::assertSent(MyMailable::class, function ($mail) {
    $mail->build();
    return $mail->subject === 'My Subject';
});

感谢 laracasts 上的 @ohffs 提供的帮助:https://laracasts.com/discuss/channels/testing/how-to-make-assertions-on-a-laravel-mailable https://laracasts.com/discuss/channels/testing/how-to-make-assertions-on-a-laravel-mailable

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 Laravel Mailable 进行断言 的相关文章

  • Symfony VS CakePHP:哪一个最接近 PHP [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我主要是一名 Rails 开发人员 但有时 我必须使用 PHP 进行编码 因为 stackoverflow com更喜欢可以回答的问题 我想知道
  • 无法访问 WordPress 中声明的全局变量

    我有以下代码 g value something print g value function get value global g value print g value print get value 当我在独立的 PHP 脚本中运行它
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Yii2:使用 Pjax POST 方法和分页在 Gridview 中搜索

    我是 yii2 的初学者 尝试在搜索按钮上使用 Pjax 来搜索 Gridview 中的字段 我已经使用 GET 方法完成此操作 但我想使用 POST 方法完成此操作 那么我该如何使用 Yii2 Pjax post 方法 和分页来做到这一点
  • 表头在 php 中的 for 循环中重复

    我正在尝试从数据库创建排行榜 我将数据打印在列表中 当我尝试将此数据放入 html 表中时 标题在每次数据输入后都会重复 这是 for 循环导致的 但我不知道如何只打印一次标题 然后将数据插入到每一行中 任何帮助将不胜感激 代码和结果的屏幕
  • 如何使用 PHP 从 MSSQL 读取图像字段

    我正在创建一个网站 需要同步从离线 MSSQL 服务器读取的在线 MySQL 数据库 除图像字段外 所有通信和从 MSSQL 读取所有字段均工作正常 我已经使用 PHP 和 Mysql 一段时间了 知道如何向 MySQL 数据库插入 检索图
  • SCORM 与 PHP/Yii 的集成 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 实际上我是新手SCORMPHP 中的实现 理论上 我在这里提问之前已经介绍了这些领域 已经看过了维基百科 http en wikipedia
  • 将一维数组转换为二维数组并加入 PHP [重复]

    这个问题在这里已经有答案了 我有这个一维数组 array1 Array coupon code gt GTY777R coupon description gt Credito 5 USD array2 二维数组 Array 0 gt Ar
  • 调用未定义的函数curl_version

    您好 我已经在运行 php 5 6 的 ubuntu 14 04 上安装了 wordpress 4 6 网站 管理页面不可见 我可以在日志中看到以下错误 致命错误 在第 274 行调用 var www html files modules
  • PHP中如何处理大于16位的值?

    我正在使用 SOAPclient 调用一个方法 该方法 远程外部 SOAP Web 服务 向我返回一个 19 位数字 我无法控制退回的内容 当我打印这个数字的值时 只有前 16 位数字是准确的 我尝试过类型转换 GMP 等 但是当 php
  • PSR-2 编码标准:为什么仅包含 PHP 的文件中没有 PHP 结束标记? [复制]

    这个问题在这里已经有答案了 我刚刚听说PSR 2编码标准 http www php fig org psr psr 2 在对此问题的评论中 是否有任何理由在方法和成员变量名称之前使用 public 关键字 https stackoverfl
  • 刷新页面后保留输入值

    我有一个带有输入字段的表单 该输入包含一个下拉菜单 从数据库中读取信息 如果用户输入值 并且当他到达下拉菜单时 他没有找到他想要的内容 他会转到另一个页面将此信息添加到下拉菜单 然后转到第一页继续输入信息 如果他转到另一个页面向下拉菜单添加
  • SMTP:无法连接套接字:无法找到套接字传输“ssl”

    我一直在尝试在 WAMP 上使用 Pear 发送电子邮件通过 GMail 花了几个小时将其全部设置并找出我遇到的所有错误后 我以为我已经很接近了 直到我开始收到此错误 Failed to connect to ssl smtp gmail
  • 正确显示mySQL一对多查询结果

    我有两张桌子 TRIPS tripID clientID and LEGS legID depart arrive tripID TRIPS 与 LEGS 具有一对多关系 因为有多个legID s per tripID 我需要以以下格式显示
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • PHP 中消息队列和工作系统的有效架构?

    我正在尝试了解我想要在 PHP 应用程序中实现的消息队列模型和作业 我的目标是卸载需要发送到多个第三方 API 的消息 数据 因此访问它们不会减慢客户端的速度 所以将数据发送到消息队列是理想的 我考虑过仅使用 Gearman 来保存 MQ
  • PHP strtotime +1 个月添加额外一个月[重复]

    这个问题在这里已经有答案了 我有一个简单的变量 可以将今天添加一个月 endOfCycle date Y m strtotime 1 month 今天是 2013 年 1 月 所以我希望返回 2013 02 但我得到的是 2013 03 我
  • PHP - 递归搜索数组中的键和子键,成功时返回键['subkey]

    因此 我编写了一个函数 该函数可以在数组中深入搜索两个级别以查找键和子键对 基本上是在寻找key subkey 如果找到 则返回key subkey 我正在寻找一种以真正递归的方式执行此操作的方法 并根据需要进行尽可能多的深度搜索 直到到达
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • Yii框架异步请求

    我有一个执行 3 个任务的 ajax 请求 保存模型 数据库 发电子邮件 给出成功或失败的消息 因为这个任务需要的时间太长了 用户最多可以等待 20 秒以获得响应 成功或失败消息 如果用户关闭浏览器 则其会停止用户当前进程的操作之一 这是糟

随机推荐