Post

SwiftData ModelContainer Lifetime in Tests

SwiftData ModelContainer Lifetime in Tests

錯誤

SwiftData 測試只保留 ModelContext,沒有保留 ModelContainer。測試一進到 modelContext.fetch(...) 就 crash,Xcode 顯示:

1
Test crashed with signal trap.

問題程式碼:

1
2
let container = try ModelContainer(...)
self.modelContext = container.mainContext

container 是區域變數,init 結束後可能被釋放。ModelContext 還在,但底層 CoreData stack 生命週期已經不可靠。

解法

測試 harness 要明確持有 ModelContainer

1
2
let modelContainer: ModelContainer
let modelContext: ModelContext

建立後一起保存:

1
2
self.modelContainer = container
self.modelContext = container.mainContext

記住

SwiftData 單元測試不要只保存 mainContextModelContainerModelContext 要一起活到測試結束。

This post is licensed under CC BY 4.0 by the author.