我试图在我的 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")
}
}
我的目标
我的目标是远离全局变量的使用,因为它们是代码异味。我正在尝试解决我的代码异味。
我正在寻找的答案可以是:
- 允许在我的 UITests 中使用 @EnvironmentObject 的解决方案!
- 关于为什么这是不可能的解释和/或全局变量和@EnvironmentObject 的替代解决方案,它可以工作,看起来很干净并且不是不同的代码气味。