在 Laravel 中測試 JSON 列之間的相等性需要特別考慮,因為 JSON 資料在資料庫中儲存為字串。在比較 JSON 欄位時,JSON 編碼方式的差異可能會導致意外的測試失敗。本文將指導您在 Laravel 應用程式的測試中有效比較 JSON 欄位。
了解挑戰
JSON資料儲存到資料庫時,是以字串的形式保存的。 JSON 編碼中的微小差異(例如鍵的間距或順序)可能會導致直接字串比較失敗。這意味著即使內容在邏輯上是等效的,使用 $this->assertDatabaseHas() 的測試也可能會失敗。
模型範例
首先,考慮 PriceSchedule 模型,其中包含 JSON 欄位:
final class PriceSchedule extends Model { protected $fillable = [ 'user_id', 'price_supplier_id', 'weekday', 'hour', 'is_active' ]; protected $casts = [ 'weekday' => 'array', 'hour' => 'array', ]; }
工作日和小時屬性轉換為數組,以便在應用程式中輕鬆操作。
編寫測試
以下是更新 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 比較的常見問題
使用 $this->assertDatabaseHas() 比較工作日、小時等 JSON 類型值時,由於 JSON 編碼的差異,可能會導致直接比較失敗。例如:
- 資料庫儲存的 JSON: {"key":"value"}
- PHP 產生的 JSON:{ “鍵”:“值” }
即使資料在邏輯上相同,測試也可能會因為字串不同而失敗。
解決方案:使用 $this->castAsJson()
為了確保比較一致,請在斷言 JSON 欄位時使用 $this->castAsJson():
$this->assertDatabaseHas(PriceSchedule::class, [ 'user_id' => $user->id, 'is_active' => $updatedData['is_active'], 'weekday' => $this->castAsJson($updatedData['weekday']), 'hour' => $this->castAsJson($updatedData['hour']), ]);
此方法確保測試資料和資料庫資料在比較之前都轉換為通用的 JSON 格式。
測試輸出
運行測試會產生以下結果:
Price Export Schedule (PriceExportSchedule) ✔ Price export schedule update OK (1 test, 3 assertions)
透過使用 $this->castAsJson(),您可以避免 JSON 編碼問題並確保您的測驗既可靠又
準確。
以上是如何在 Laravel 模型中測試相等的 JSON 列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中