ランキングに戻る

nalexn/ViewInspector

Swift

Runtime introspection and unit testing of SwiftUI views

swiftuiswiftui-viewsunit-testingruntime-typecheckingbest-practicesswiftswift5
スター成長
スター
2.6k
フォーク
188
週間成長
Issue
54
2.6k
7月18日7月19日7月19日7月20日
README

ViewInspector 🕵️‍♂️ for SwiftUI

Platform codecov

ViewInspector is a library for unit testing SwiftUI views. It allows for traversing a view hierarchy at runtime providing direct access to the underlying View structs.

Why?

SwiftUI view is a function of state. We could provide it with the input but could not verify the output... Until now!

Use cases

1. Search the view of a specific type or condition

Use one of the find functions to quickly locate a specific view or assert there are none of such:

try sut.inspect().find(button: "Back")

try sut.inspect().findAll(ViewType.Text.self,
                          where: { try $0.attributes().isBold() })

Check out this section in the guide for the reference.

2. Read the inner state of the standard views

Standard SwiftUI views are no longer a black box:

let sut = Text("Completed by \(72.51, specifier: "%.1f")%").font(.caption)

let string = try sut.inspect().text().string(locale: Locale(identifier: "es"))
XCTAssertEqual(string, "Completado por 72,5%")

XCTAssertEqual(try sut.inspect().text().attributes().font(), .caption)

Each view has its own set of inspectable parameters, you can refer to the API coverage document to see what's available for a particular SwiftUI view.

3. Verify your custom view's state

Obtain a copy of your custom view with actual state and references from the hierarchy of any depth:

let sut = try view.inspect().find(CustomView.self).actualView()
XCTAssertTrue(sut.viewModel.isUserLoggedIn)

The library can operate with various types of the view's state, such as @Binding, @State, @ObservedObject and @EnvironmentObject.

4. Trigger side effects

You can simulate user interaction by programmatically triggering system-control callbacks:

try sut.inspect().find(button: "Close").tap()

let list = try view.inspect().list()
try list[5].view(RowItemView.self).callOnAppear()

The library provides helpers for writing asynchronous tests for views with callbacks.

FAQs

Which views and modifiers are supported?

Check out the API coverage.

Is it using private APIs?

ViewInspector is using the official Swift reflection API to dissect the view structures. So it'll be production-friendly even if you could somehow ship the test target to the production.

How do I add it to my Xcode project?

Assure you're adding the framework to your unit-test target. Do NOT add it to the main build target.

Swift Package Manager

https://github.com/nalexn/ViewInspector

Carthage

github "nalexn/ViewInspector"

CocoaPods

pod 'ViewInspector'

How do I use it in my project?

Please refer to the Inspection guide. You can also check out my other project that harnesses the ViewInspector for testing the entire UI.

Contributions

Contributions are welcomed! If you see an unsupported view or modifier, you can either open an issue (so I could prioritize such SwiftUI APIs over the rest), or try to crack it yourself: use the print("\(Inspector.print(<#view#>) as AnyObject)") as the starting point of the investigation.

関連リポジトリ
dkhamsing/open-source-ios-apps

:iphone: Collaborative List of Open-Source iOS Apps

Creative Commons Zero v1.0 Universaliosswift
51.3k6k
jordanbaird/Ice

Powerful menu bar manager for macOS

SwiftGNU General Public License v3.0macosmenubar
icemenubar.app
29k821
NativeScript/NativeScript

⚡ Write Native with TypeScript ✨ Best of all worlds (TypeScript, Swift, Objective C, Kotlin, Java, Dart). Use what you love ❤️ Angular, React, Solid, Svelte, Vue with: iOS (UIKit, SwiftUI), Android (View, Jetpack Compose), Flutter and you name it compatible.

TypeScriptnpmMIT Licensenativescriptandroid
nativescript.org
25.6k1.7k
CodeEditApp/CodeEdit

📝 CodeEdit App for macOS – Elevate your code editing experience. Open source, free forever.

SwiftMIT Licensemacosapple
codeedit.app
23k1.2k
Whisky-App/Whisky

A modern Wine wrapper for macOS built with SwiftUI

SwiftGNU General Public License v3.0macosswiftui
getwhisky.app
15.2k602
pointfreeco/swift-composable-architecture

A library for building applications in a consistent and understandable way, with composition, testing, and ergonomics in mind.

SwiftMIT Licensearchitecturecomposition
pointfree.co/collections/composable-architecture
14.8k1.7k
mrkai77/Loop

Window management made elegant.

SwiftGNU General Public License v3.0macosswift
11.2k254
gao-sun/eul

🖥️ macOS status monitoring app written in SwiftUI.

SwiftMIT Licensemacosmonitoring
9.9k373
stonerl/Thaw

Menu bar manager for macOS 26

SwiftGNU General Public License v3.0macosmacos-app
8.9k204
sindresorhus/Gifski

🌈 Convert videos to high-quality GIFs on your Mac

SwiftMIT Licensegifskigif
sindresorhus.com/gifski
8.5k320
XcodesOrg/XcodesApp

The easiest way to install and switch between multiple versions of Xcode - with a mouse click.

SwiftMIT Licensexcodeswift
xcodes.app
8.5k376
ronitsingh10/FineTune

FineTune, a macOS menu bar app for per-app volume control, multi-device output, audio routing, and 10-band EQ. Free and open-source alternative to SoundSource.

SwiftGNU General Public License v3.0audioaudio-utility
8.2k278