SwiftUI-在预览中模拟@EnvironmentObject数据

SwiftUI-在预览中模拟@EnvironmentObject数据,swift,mocking,swiftui,Swift,Mocking,Swiftui,我有以下代码: struct WelcomeView: View { @EnvironmentObject var userService: UserService var body: some View { Text(userService.user.username) } } struct WelcomeView_Previews: PreviewProvider { static var previews: some View {

我有以下代码:

struct WelcomeView: View {
    @EnvironmentObject var userService: UserService
    var body: some View {
        Text(userService.user.username)
    }
}

struct WelcomeView_Previews: PreviewProvider {
    static var previews: some View {
        WelcomeView().environmentObject(UserService())
    }
}

我想要实现的是,我的所有UI组件都使用模拟数据。我需要告诉大家,在预览中,我希望看到
文本(userService.user.username)
作为
文本(“Alex”)
。我怎样才能让它工作?我需要在哪里初始化我的
user.username
以及在哪里放置此模拟。我只想对所有视图使用
user
对象。在本例中,我跳过了它们。

您可以在服务级别或视图级别插入模拟数据。由于您将在多个视图中使用此功能,因此我建议将模拟功能添加到服务中(如下面的第一个示例所示)

我不知道您的
UserService
是什么样子,所以我在这些示例中添加了一个基本实现

服务水平 视图级别
假设
UserService
使用依赖项注入进行了正确的设计,那么它可以在生产代码中进行任何显式更改时使用以下方法

struct WelcomeView_Previews: PreviewProvider {
    static var previews: some View {
        let userService = UserService()
        userService.user = User(username: "Alex", email: "alex@test.com") // << any predefined set up here
        // any more parameters set up here

        return WelcomeView().environmentObject(userService)
    }
}
struct WelcomeView\u预览:预览提供程序{
静态var预览:一些视图{
让userService=userService()
userService.user=用户(用户名:“Alex”,电子邮件:alex@test.com") //
import SwiftUI

struct User {
    var username: String
}

class UserService: ObservableObject {
    @Published var user: User = User(username: "Initial username")
}

struct WelcomeView: View {
    @EnvironmentObject var userService: UserService

    // Optional mock user. Will replace the user from UserService if provided.
    var mockUser: User? = nil

    var body: some View {
        Text((mockUser != nil) ? mockUser!.username : userService.user.username)
    }
}

struct WelcomeView_Previews: PreviewProvider {
    static var previews: some View {
        WelcomeView(mockUser: User(username: "Test username"))
            .environmentObject(UserService())
    }
}
struct WelcomeView_Previews: PreviewProvider {
    static var previews: some View {
        let userService = UserService()
        userService.user = User(username: "Alex", email: "alex@test.com") // << any predefined set up here
        // any more parameters set up here

        return WelcomeView().environmentObject(userService)
    }
}