如何在 Laravel 模型中测试相等的 JSON 列

如何在 laravel 模型中测试相等的 json 列

Laravel 中 JSON 列的等值测试并非易事,因为数据库将 JSON 数据存储为字符串。 细微的 JSON 编码差异(例如键的顺序或空格)可能导致测试意外失败。本文将指导您如何在 Laravel 测试中有效地比较 JSON 列。

挑战:JSON 编码差异

数据库中存储的 JSON 数据是字符串形式。JSON 编码的细微差别(例如键的顺序或空格)会导致直接字符串比较失败。即使逻辑上等价,$this->assertDatabaseHas() 也可能因这些差异而导致测试失败。

模型示例:PriceSchedule

假设有一个 PriceSchedule 模型,包含 JSON 列:

final class PriceSchedule extends Model{    protected $fillable = [        'user_id',        'price_supplier_id',        'weekday',        'hour',        'is_active'    ];    protected $casts = [        'weekday' => 'array',        'hour' => 'array',    ];}

weekdayhour 属性被转换为数组,方便应用内操作。

测试案例:更新 PriceSchedule

以下是一个更新 PriceSchedule 的测试示例:

final class PriceExportScheduleTest extends TestCase{    public function test_price_export_schedule_update(): void    {        $user = UserFactory::new()->create();        $this->actingAsFrontendUser($user);        $priceSchedule = PriceScheduleFactory::new()->make();        $updatedData = [            'weekday' => $this->faker->randomElements(DayOfWeek::values(), 3),            'hour' => $priceSchedule->hour,            'is_active' => true,        ];        $response = $this->putJson(route('api-v2:price-export.suppliers.schedules.update'), $updatedData);        $response->assertNoContent();        $this->assertDatabaseHas(PriceSchedule::class, [            'user_id' => $user->id,            'is_active' => $updatedData['is_active'],            'weekday' => $updatedData['weekday'],            'hour' => $updatedData['hour'],        ]);    }}

JSON 比较问题

百灵大模型 百灵大模型

蚂蚁集团自研的多模态AI大模型系列

百灵大模型 177 查看详情 百灵大模型

使用 $this->assertDatabaseHas() 直接比较 weekdayhour 等 JSON 列时,JSON 编码差异可能导致测试失败。例如:

数据库中的 JSON: {"key":"value"}PHP 生成的 JSON: { "key":"value" }

即使数据逻辑上相同,测试也可能因字符串不匹配而失败。

解决方案:使用自定义辅助函数或 json_encode

为了确保一致的比较,在断言 JSON 列时,可以使用一个自定义的辅助函数或直接使用PHP的json_encode函数,并设置合适的选项以确保一致的JSON格式:

//方法一:使用自定义辅助函数//在你的测试辅助函数中添加以下函数:function castAsJson($data) {    return json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);}//然后在测试中使用:$this->assertDatabaseHas(PriceSchedule::class, [    'user_id' => $user->id,    'is_active' => $updatedData['is_active'],    'weekday' => castAsJson($updatedData['weekday']),    'hour' => castAsJson($updatedData['hour']),]);//方法二:直接使用json_encode$this->assertDatabaseHas(PriceSchedule::class, [    'user_id' => $user->id,    'is_active' => $updatedData['is_active'],    'weekday' => json_encode($updatedData['weekday'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),    'hour' => json_encode($updatedData['hour'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),]);

这确保了测试数据和数据库数据在比较前都转换为标准化的 JSON 格式。 JSON_UNESCAPED_UNICODEJSON_UNESCAPED_SLASHES 选项可以防止特殊字符导致的差异。 JSON_PRETTY_PRINT (方法一) 可以使JSON输出更易读,但如果只是为了测试相等性,可以省略。

测试结果

运行测试后,结果应该显示测试通过:

Price Export Schedule (PriceExportSchedule)✔ Price export schedule updateOK (1 test, 3 assertions)

通过使用自定义辅助函数或 json_encode 并设置合适的选项,可以避免 JSON 编码问题,确保测试的可靠性和准确性。

以上就是如何在 Laravel 模型中测试相等的 JSON 列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/390867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 15:42:47
下一篇 2025年11月6日 15:43:19

相关推荐

  • 云闪付怎么快速赚取积点_云闪付积点快速获取方法

    通过微信小程序用云闪付支付可日赚692积点;62VIP会员消费满10元返积点,月上限3000;转账超1000元得2积点,还款超100元得10积点,每月各限3笔;扫本人收款码支付5元以上每笔得10积点,日限3笔;改定位至杭州领“浙里有优惠”活动卡可得2025积点。 如果您在使用云闪付时希望快速积累积点…

    2025年12月6日 软件教程
    600
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • 华为新机发布计划曝光:Pura 90系列或明年4月登场

    近日,有数码博主透露了华为2025年至2026年的新品规划,其中pura 90系列预计在2026年4月发布,有望成为华为新一代影像旗舰。根据路线图,华为将在2025年底至2026年陆续推出mate 80系列、折叠屏新机mate x7系列以及nova 15系列,而pura 90系列则将成为2026年上…

    2025年12月6日 行业动态
    100
  • 2025年双十一买手机选直板机还是选折叠屏?建议看完这篇再做决定

    随着2025年双十一购物节的临近,许多消费者在选购智能手机时都会面临一个共同的问题:是选择传统的直板手机,还是尝试更具科技感的折叠屏设备?其实,这个问题的答案早已在智能手机行业的演进中悄然浮现——如今的手机市场已不再局限于“拼参数、堆配置”的初级竞争,而是迈入了以形态革新驱动用户体验升级的新时代。而…

    2025年12月6日 行业动态
    000
  • 猜一猜卡牌评级师评定的是什么产品

    支付宝蚂蚁新村最新答案2025年10月25日 1、猜一猜:“卡牌评级师”评定的是什么产品 2、正确答案:热门卡牌 3、答案解析: Type Studio 一个视频编辑器,提供自动转录、自动生成字幕、视频翻译等功能 61 查看详情 近年来,潮玩市场持续升温,卡牌逐渐成为潮流文化与热门IP结合的重要形式…

    2025年12月6日 软件教程
    000
  • 长城汽车公布最新财报:前三季度卖车92万辆 净赚86亿元

    10月24日,长城汽车今日下午公布了其2025年第三季度财务报告。 财报数据显示,今年前三季度,长城汽车实现营业收入1535.82亿元,同比增长7.96%;归属于上市公司股东的净利润为86.35亿元,同比下降16.97%。其中,第三季度单季营收达612.47亿元,同比增长20.51%;归母净利润为2…

    2025年12月6日 行业动态
    000
  • 「世纪传奇刀片新篇」飞利浦影音双11声宴开启

    百年声学基因碰撞前沿科技,一场有关声音美学与设计美学的影音狂欢已悄然引爆2025“双十一”! 当绝大多数影音数码品牌还在价格战中挣扎时,飞利浦影音已然开启了一场跨越百年的“声”活革命。作为拥有深厚技术底蕴的音频巨头,飞利浦影音及配件此次“双十一”精准聚焦“传承经典”与“设计美学”两大核心,为热爱生活…

    2025年12月6日 行业动态
    000
  • 中国大陆电竞显示器线上销量出炉:小米第6 增速最快

    10月25日消息,今天,洛图科技发布的2025q3中国大陆电竞显示器线上市场最新报告。 报告显示,其中AOC以近20%的份额领跑,销量同比增长57%。HKC位居第二,销量同比增长53%。 KTC、SANC、泰坦军团也进入前五,但销量分别下滑了23%、13%和25%,主要原因是去年9月国补政策导致的高…

    2025年12月6日 行业动态
    000
  • 《黑神话:悟空》官方宣布全新艺术展要来了!馆内还有老熟人

    《黑神话:悟空》官方今日正式发布消息,《黑神话:悟空》遇见山西——古建数字艺术展将于2025年11月1日在太原美术馆·古县城美术新空间正式启动。据悉,此次展览将集中呈现山西大地上的古建筑精华,让观众沉浸式体验中华文明绵延千年的辉煌遗产。更有神秘“老朋友”可能现身展馆,亲自担任导览角色,带来惊喜互动。…

    2025年12月6日 游戏教程
    000
  • RTX 5090性能怪兽!雷蛇灵刃18 2025游戏本图赏

    10月25日,雷蛇正式推出全新灵刃18 2025款旗舰级游戏笔记本,首发搭载nvidia rtx 50系列显卡,起售价为25999元。 目前该机型已抵达评测室,以下为实机图赏。 新款灵刃18配备一块18英寸双模屏幕,支持UHD+ 240Hz与FHD+ 440Hz两种显示模式,响应时间最快可达3ms。…

    2025年12月6日 行业动态
    000
  • 如何在mysql中定期清理过期备份文件

    通过Shell脚本结合cron定时任务实现MySQL过期备份文件自动清理,首先统一备份命名格式(如backup_20250405.sql)并存放在指定目录(/data/backup/mysql),然后编写脚本使用find命令删除7天前的.sql文件,配置每日凌晨2点执行的cron任务,并加入日志记录…

    2025年12月6日 数据库
    000
  • 复古生存恐怖游戏《血肉生惧》月底登陆Steam

    德国独立游戏发行商assemble entertainment携手美国独立开发团队tainted pact正式宣布,其精心打造的复古风生存恐怖游戏《血肉生惧》(flesh made fear)将于2025年10月31日通过steam平台登陆pc。本作是知名制作人迈克尔·科西奥的最新力作,他曾主导创作…

    2025年12月6日 游戏教程
    000
  • 原始传奇礼包码大全 2025最新可用礼包码

    原始传奇提供新手专享、vip特权、限时活动等多种类型的礼包码,奖励内容包括万年雪霜、火龙宝箱等实用道具。玩家需在游戏内设置界面的兑换码入口进行输入使用。部分礼包码有效期截止至2025年12月31日,建议尽快领取以免错过。 以下是原始传奇2025年最新可使用的礼包码及详细兑换说明: 一、当前有效礼包码…

    2025年12月6日 游戏教程
    000
  • 贪吃蛇大作战兑换码汇总 2025最新可用兑换码大全

    幻兽爱合成 2025 年最新可用水晶兑换码及使用说明如下: 一、当前有效兑换码类型整理 基础通用兑换码:如 s9q0n3、sxj06r、iiq0ya、7590dm、77d0yz、dy0k5e 等。其中,s9q0n3 可领取中级神秘蛋 ×5、三花猫蛋 ×5、幻兽之家 ×3;7590dm 可获取废旧金库…

    2025年12月6日 游戏教程
    000
  • 在Laravel中处理JSON字段并计算每行总和的教程

    本教程旨在指导如何在laravel应用中处理存储为json字符串的数据库字段。我们将通过一个具体示例,展示如何从json字段中提取数值并计算每条记录的总和,并探讨如何通过控制器逻辑和laravel模型访问器实现这一功能,以提高代码的可读性和维护性。 场景描述 在现代Web应用开发中,有时我们需要在数…

    2025年12月6日 后端开发
    000
  • 豆豆打僵尸兑换码大全 豆豆打僵尸兑换码2025最新一览

    豆豆打僵尸官方发布了一系列福利兑换码,最新兑换码为anhsxrztde、anjhpucfkh、ankurbsphj、anmxcmvbzt,只需在指定的界面输入即可领取,一起来看看吧。 豆豆打僵尸兑换码大全 一、兑换码 最新兑换码:anhsxrztde、anjhpucfkh、ankurbsphj、an…

    2025年12月6日 游戏教程
    000
  • 英特尔Q3财报:终于扭亏为盈 净利润41亿美元

    当地时间23日,美国芯片巨头英特尔发布了2025年第三季度财报,宣布公司成功实现盈利,终结了连续六个季度的亏损局面。这是英特尔在美国政府注资后发布的首份季度财报,营收和净利润双双超出市场预期,净利润高达41亿美元,与去年同期166亿美元的净亏损形成鲜明对比。受此利好消息影响,英特尔美股盘后股价大涨约…

    2025年12月6日 行业动态
    000
  • 如何在Laravel中计算JSON字符串字段中各值的总和

    本教程将指导您如何在laravel应用中,从数据库中存储的json字符串字段(例如element_degree)中提取并计算每个记录(如用户)内所有键值对中数值的总和。通过遍历模型集合、解码json数据并累加其内部数值,您可以轻松地为每条记录生成一个聚合总和。 在现代Web开发中,我们经常需要在数据…

    2025年12月6日 后端开发
    000
  • Laravel HTTP 测试重定向失败:问题诊断与解决方案

    本文旨在解决 Laravel 8 HTTP 测试中 `Failed asserting that two strings are equal` 错误,该错误通常发生在断言重定向 URL 时。通过分析问题原因,提供清除路由缓存、检查路由定义等多种解决方案,帮助开发者确保 HTTP 测试的准确性和可靠性…

    2025年12月6日 后端开发
    000
  • 潘多拉英雄幻想兑换码大全 2025最新可用兑换码分享

    潘多拉英雄幻想有 6 组最新兑换码,其中 “月满此时暖意相伴” 有效期至 2025 年 11 月 6 日 12:00,其余兑换码未标明具体时效,建议尽快使用。 以下是潘多拉英雄幻想当前可使用的兑换码列表: 一、最新可用兑换码一览 目前已知有效兑换码包括:YXHX666、YXHX888、QHBQEW7…

    2025年12月6日 游戏教程
    000

发表回复

登录后才能评论
关注微信