Testing SwiftUI

Unit Test a ViewModel

Place business logic in a ViewModel and verify it using XCTestCase.

Syntax:

  • final class MyTests: XCTestCase { ... }
  • assertions like XCTAssertEqualXCTAssertTrue

Example

Demo.swift

ContentView.swift

App.swift

CounterViewModelTests.swift

import SwiftUI
import Combine

final class CounterViewModel: ObservableObject {
  @Published private(set) var count = 0
  func increment() { count += 1 }
}

struct CounterView: View {
  @StateObject private var vm = CounterViewModel()
  var body: some View {
VStack(spacing: 12) {
  Text("Count: \(vm.count)")
  Button("Increment") { vm.increment() }
}
} }

This example verifies that calling increment() updates the published count.


Prerequisites (UI Testing Target)

  • Add a UI Testing Bundle target (File → New → Target → UI Testing Bundle).
  • Prefer locating elements by accessibility identifiers rather than visible text.
  • Pass launch arguments and environment to control app state for tests (e.g., reset data, use fakes).

UI Test a SwiftUI View

Drive the app with XCUIApplication and locate elements by accessibility.

Syntax:

  • let app = XCUIApplication(); app.launch()
  • app.buttons["Label"].tap()

Example

Demo.swift

ContentView.swift

App.swift

MyUITests.swift

import SwiftUI

struct UITestDemo: View {
  @State private var count = 0
  var body: some View {
VStack(spacing: 12) {
  Text("Count: \(count)").accessibilityIdentifier("countLabel")
  Button("Increment") { count += 1 }
    .accessibilityIdentifier("incrementButton")
}
} }

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *