2

我试图在我的 UITests 中使用 @EnvironmentObject,但在运行时出现错误。

线程 1:致命错误:未找到 Person 类型的 ObservableObject。Person 的 View.environmentObject(_:) 作为该视图的祖先可能会丢失。

不工作

以下代码在运行 UITest 时会引发上述错误。

import SwiftUI

@main
struct RootView: App {
    var body: some Scene {
        WindowGroup {
            AppView()
                .environmentObject(Person())
        }
    }
}

class Person: ObservableObject {
    @Published var name = "Lex"
}

用户界面测试

import XCTest
import SwiftUI

class AppTests: BaseUITest {
    @EnvironmentObject var person: Person
    
    func testPerson() {
        assert(person.name == "Lex")
    }
}

// For your info.
class BaseUITest: XCTestCase {
    let app = XCUIApplication()
    
    override func setUpWithError() throws {
        continueAfterFailure = false
        app.launch()
    }
}

当前替代方案:全局变量

下面的代码工作得很好。

import SwiftUI

var person = Person()

@main
struct RootView: App {
    var body: some Scene {
        WindowGroup {
            AppView()
                .environmentObject(person)
        }
    }
}

import XCTest

class AppTests: BaseUITest {
    func testPerson() {
        assert(person.name == "Lex")
    }
}

我的目标

我的目标是远离全局变量的使用,因为它们是代码异味。我正在尝试解决我的代码异味。

我正在寻找的答案可以是:

  1. 允许在我的 UITests 中使用 @EnvironmentObject 的解决方案!
  2. 关于为什么这是不可能的解释和/或全局变量和@EnvironmentObject 的替代解决方案,它可以工作,看起来很干净并且不是不同的代码气味。
4

0 回答 0