SwiftUI: объекты среды, не найденные во время UITest - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь запустить 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, чтобы включить объекты среды или что-то еще?

1 Ответ

0 голосов
/ 03 мая 2020

добавьте .environmentObject (TabCommands ()) за вашим SearchView .... и всеми другими объектами Environmentobject, которые вы там тоже используете ... не только для ContentView.

вот так:

  UIKitTabView.Tab(view: NavigationView {
                SearchView().environmentObject(TabCommands())
                    Spacer()
            }, title: "menu_home".localized(), image: "magnifyingglass"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...