Доступ к экземпляру класса в XCTest с использованием SwiftUI и @EnvironmentObject - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть иерархия SwiftUI View с экземпляром пользовательского класса, внедренным с помощью .environment (), похожим на следующее:

struct ContentView: View {

  // Pointer to the AppStateController passed in .environment()
  @EnvironmentObject var appStateController: AppStateController

  var body: some View {
    VStack(spacing: 0) {
      TitleView()
        .modifier(TitleStyle())
        .environmentObject(appStateController)
      Spacer()
    }
  }

}


struct TitleView: View {

  @EnvironmentObject var appStateController: AppStateController

  var body: some View {

    Button(action: {
      self.appStateController.isPlaying.toggle()
    }, label: {
      if self.appStateController.isPlaying {
        Image(systemName: "stop.circle")
          .opacity(self.appStateController.isPlayable ? 1.0 : 0.5)
          .accessibility(label: Text("stop"))
      }
      else {
        Image(systemName: "play.circle")
          .opacity(self.appStateController.isPlayable ? 1.0 : 0.5)
          .accessibility(label: Text("play"))
      }
    })
  }

}

В TitleView есть несколько кнопок, действия которых меняются @Published значения в appStateController. Кнопки также меняют свою метку (значок) при нажатии.

Я только начинаю с модульного тестирования пользовательского интерфейса, и дошел до того, что тестирование касания кнопки меняет значок (путем поиска кнопки и проверки это метка доступности), и это прекрасно работает, но я также хотел бы заявить, что действие действительно что-то делает, проверив логический appStateController.isPlaying - эффективно проверяя, что мое действие: {} замыкание делает то, что мне нужно.

Кажется, я не могу найти какую-либо документацию, которая говорит мне, как при работающем приложении я могу найти ссылку через иерархию представлений на внедренный appStateController и проверить содержащиеся в нем атрибуты. Возможно ли это, и если да, кто-нибудь знает, где я могу найти некоторые документы / статьи в блоге по этому поводу?

1 Ответ

0 голосов
/ 18 апреля 2020

В тестировании пользовательского интерфейса вы проверяете потоки пользовательского интерфейса, а не внутренние состояния механизма, поэтому вы можете проверить, что пользовательский интерфейс представляет правильное состояние (ie. Двигатель завершил работу правильно и пользовательский интерфейс обновлен соответственно). Для этого ему необходимо определить требуемые элементы пользовательского интерфейса и затем проверить, присутствует ли желаемый элемент во время выполнения.

Здесь возможен подход. Протестировано с Xcode 11.4.

1) в коде добавить идентификаторы доступности

      if self.appStateController.isPlaying {
        Image(systemName: "stop.circle")
          .opacity(self.appStateController.isPlayable ? 1.0 : 0.5)
          .accessibility(identifier: "playing")       // identify state !!
          .accessibility(label: Text("stop"))
      }
      else {
        Image(systemName: "play.circle")
          .opacity(self.appStateController.isPlayable ? 1.0 : 0.5)
          .accessibility(identifier: "idle")
          .accessibility(label: Text("play"))        // identify state !!
      }

2) в X C test

    func testPlaying() throws {
        // UI tests must launch the application that they test.
        let app = XCUIApplication()
        app.launch()

        // UI manipulations to activate playback

        XCTAssertTrue(app.images["playing"].exists)
    }
...