laravel怎么在测试中模拟通知的发送(Notification Fake)_laravel测试中Notification Fake方法

发布时间 - 2025-10-18 00:00:00    点击率:
在 Laravel 测试中,使用 Notification::fake() 可模拟通知发送行为,避免实际调用外部服务。首先调用 Notification::fake() 拦截通知,然后通过 assertSentTo 等方法断言用户是否收到指定通知,如 Notification::assertSentTo($user, AccountApprovedNotification::class);支持验证发送次数、未发送情况及通知参数内容,例如通过闭包检查通知数据或通道,确保 order_id 正确或包含 mail 通道;同一测试中可多次调用 fake() 清除记录以隔离场景。该方式提升测试速度与稳定性,无需依赖真实邮件或短信服务。

在 Laravel 测试中,你不需要实际发送通知(Notification),而是可以通过 Notification Facade 的 Fake 功能来模拟通知的发送行为。这样可以避免调用真实邮件、短信或第三方服务,同时还能验证通知是否被正确分发给目标用户。

1. 使用 Notification::fake() 模拟通知

在测试开始前调用 Notification::fake(),Laravel 会拦截所有通知发送请求,不会真正触发任何外部操作。

示例:

use Illuminate\Support\Facades\Notification;
use Tests\TestCase;

class UserNotificationTest extends TestCase
{
    public function test_notification_sent_to_user()
    {
        Notification::fake(); // 启用通知模拟

        $user = factory(User::class)->create();

        // 触发某个会发送通知的操作
        $user->notify(new AccountApprovedNotification());

        // 断言指定用户收到了指定通知
        Notification::assertSentTo($user, AccountApprovedNotification::class);
    }
}

2. 常用断言方法

启用 fake 后,你可以使用以下方法验证通知行为:

  • assertSentTo($notifiable, $notification):断言某个可通知对象收到了指定通知。
  • assertNotSentTo($notifiable, $notification):断言某个对象没有收到该通知。
  • assertNothingSent():断言没有任何通知被发送。
  • assertSentToTimes($notifiable, $notification, $times):断言通知被发送了指定次数。

示例:验证发送次数

Notification::assertSentToTimes($user, AccountApprovedNotification::class, 1);

3. 检查通知的参数内容

你还可以检查通知实例中的数据,确保传递的内容正确。

Notification::assertSentTo(
    $user,
    AccountApprovedNotification::class,
    function ($notification, $channels) use ($expectedData) {
        return $notification->order->id === $expectedData['order_id'];
    }
);

上面的闭包接收通知实例和通道数组,返回 true 表示匹配成功。可用于验证通知携带的数据是否符合预期。

4. 针对不同通道的测试

Laravel 通知支持多种通道(如 mail、database、broadcast 等)。你可以验证通知是否通过特定通道发送。

Notification::assertSentTo(
    $user,
    AccountApprovedNotification::class,
    function ($notification, $channels) {
        return in_array('mail', $channels); // 确保通过邮件通道发送
    }
);

5. 清除已记录的通知

如果你在同一个测试中需要分别测试多个场景,可以使用 Notification::fake() 重置记录:

Notification::fake(); // 清空之前记录
// 执行新操作并断言

每次调用 fake() 都会清空之前的发送记录,适合隔离不同测试逻辑。

基本上就这些。只要记得先调用 Notification::fake(),再执行业务逻辑,最后用断言验证行为即可。这种方式让测试更快速、稳定,且不依赖外部服务。


# laravel  # cad  # app  # ai  # mail  # class  # 闭包  # 对象  # database  # 你可以  # 测试中  # 收到了  # 清空  # 如果你  # 多个  # 还能  # 没有任何  # 你还  # 你不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  高端网站建设与定制开发一站式解决方案 中企动力  PHP正则匹配日期和时间(时间戳转换)的实例代码  jQuery 常见小例汇总  制作旅游网站html,怎样注册旅游网站?  创业网站制作流程,创业网站可靠吗?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  开心动漫网站制作软件下载,十分开心动画为何停播?  详解MySQL数据库的安装与密码配置  JavaScript模板引擎Template.js使用详解  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何在香港免费服务器上快速搭建网站?  微信小程序 scroll-view组件实现列表页实例代码  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  JavaScript实现Fly Bird小游戏  如何用搬瓦工VPS快速搭建个人网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  iOS UIView常见属性方法小结  Firefox Developer Edition开发者版本入口  如何快速选择适合个人网站的云服务器配置?  深圳网站制作培训,深圳哪些招聘网站比较好?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  js代码实现下拉菜单【推荐】  Laravel如何实现API资源集合?(Resource Collection教程)  php 三元运算符实例详细介绍  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何快速搭建二级域名独立网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何快速上传建站程序避免常见错误?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  三星网站视频制作教程下载,三星w23网页如何全屏?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  长沙做网站要多少钱,长沙国安网络怎么样?  Bootstrap整体框架之JavaScript插件架构  如何获取PHP WAP自助建站系统源码?