SwiftData e o +Sangue
Fala Time! Recentemente a Apple lançou uma nova framework para auxiliar no uso do CoreData em Swift, tirando toda a "burocracia" que era fazer toda a modelagem de dados, migração para uma nova versão e dados e afins.
Comecei a criar o +Sangue e me deparei com a duvida de como criar mocks dessas classes que de fato ficam "salvos" enquanto os testes unitários rodam e vim compartilhar uma solução com vocês que eu criei no +Sangue.
Primeira mente gostaria de ressaltar que não uso Environment object e as @Query que a Apple introduziu no SwiftUI, na verdade eu tenho uma classe Interactor que é responsável por fazer a busca, inserir, apagar os dados, e ela recebe o ModelContext do SwiftData já configurado.
SwiftData Model
@Model
class ProfileData {
@Attribute(.unique) let id: UUID
var name: String
var weight: Float
}
Essa aqui é nossa classe padrão com SwiftData, tendo a anotação @Model e 3 atributos.
Agora dentro da nossa Target de Testes, vamos criar uma extension do Model Context e uma função estática.
import SwiftData
@testable import MainProject
extension ModelContext {
@MainActor static func setupUnitTest() -> ModelContext {}
}
A função está como @MainActor pois queremos que rode na Main Thread temos algumas configuras que são async.
Dentro da função vamos criar uma modelConfiguration passando os types que são Models do SwiftData, nesse caso o ProfileData e setando como true a propriedade isStoredInMemoryOnly.
Depois pegamos nosso ModelContainer e passamos as configurações e novamente os Models do SwiftData, capturamos o mainContext do Container criado.
let configuration = ModelConfiguration(
for: ProfileData.self
isStoredInMemoryOnly: true
)
let inMemoryContainer = try! ModelContainer(
for: ProfileData.self,
configurations: configuration
)
let context = inMemoryContainer.mainContext
let mock = ProfileData(
id: .init(),
name: "+Sangue",
weight: 90.0,
)
context.insert(mock)
return context
Depois disso é basicamente criar nosso ProfileData e pedir pro Context da um Insert e sucesso.
Nesse Caso eu só criei um mock mas você pode criar quantos quiser, principalmente se tiver uma lista pra ser exibido.
Como eu falei que acabo passando o ModelContext pro Interactor realizar os CRUDs por isso no final eu dou um return no Context. Caso você esteja usando o Modelo padrão que a Apple cria com o SwiftData talvez alguns ajustes sejam necessários.
Até a Próxima
Comments