Unit Test a ViewModel
Place business logic in a ViewModel and verify it using XCTestCase.
Syntax:
final class MyTests: XCTestCase { ... }- assertions like
XCTAssertEqual,XCTAssertTrue
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")
}
}
}
Leave a Reply