0

0

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

霞舞

霞舞

发布时间:2025-01-07 22:46:46

|

664人浏览过

|

来源于php中文网

原创

如何在 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 比较问题

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载

使用 $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 update
OK (1 test, 3 assertions)

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

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2631

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1630

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1511

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1418

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1447

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号