Я пытаюсь запустить UI Tests в своем проекте Xcode 11 (для создания моментальных снимков в fastlane), но я сталкиваюсь с довольно странной ситуацией.
Когда я запускаю тест, приложение вылетает сразу после отображается домашняя страница с ошибкой:
Fatal error: No ObservableObject of type TabCommands found. A View.environmentObject(_:) for TabCommands may be missing as an ancestor of this view.: file SwiftUI, line 0
Но при нормальном запуске приложения такой ошибки нет.
Вот иерархия app:
Scene Delegate создает представление с объектами среды
let contentView = ContentView()
.environmentObject(UserManager())
.environmentObject(TabCommands())
.environmentObject(IAPStore())
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
представление содержимого использует TabView на основе UIViewControllerRepresentable:
var body: some View {
UIKitTabView([
UIKitTabView.Tab(view: NavigationView {
HomeContentView()
Spacer()
}, title: "menu_home".localized(), image: "house"),
UIKitTabView.Tab(view: NavigationView {
SearchView()
Spacer()
}, title: "menu_home".localized(), image: "magnifyingglass"),
UIKitTabView.Tab(view: NavigationView {
UserTabRootLoading()
Spacer()
}, title: "menu_home".localized(), image: "person.crop.circle"),
])
.edgesIgnoringSafeArea(.bottom)
.edgesIgnoringSafeArea(.top)
}
Cra sh происходит внутри тела SearchView, в навигационной ссылке используется объект EnvironmentVariable для статуса isActive
(чтобы вернуться к 3 представлениям позже без передачи значения).
struct SearchView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@EnvironmentObject var tabCommands: TabCommands
@EnvironmentObject var userManager: UserManager
var body: some View {
ZStack {
Color.black.edgesIgnoringSafeArea(.all)
NavigationLink(destination: PremiumView()
.navigationBarTitle("")
.navigationBarHidden(true),
isActive: self.$tabCommands.isStartPremiumViewActive) {
EmptyView()
}.isDetailLink(false)
}
}
(я удалил остальную часть кода)
TabCommand является ObservableObject с 6 строками @Published var myVar = false
Опять же, когда я запускаю приложение на симуляторе или на устройстве , приложение работает так, как и ожидалось, проблема s возникает только при запуске тестов пользовательского интерфейса.
Когда я пытаюсь выполнить простой тест с использованием только
let app = XCUIApplication()
app.launch()
, тест завершается успешно. Сбой при добавлении первой строки app.staticTexts["MainButton"].tap()
Есть ли какая-то конфигурация, которую необходимо выполнить в Scene Delegate, чтобы включить объекты среды или что-то еще?