-
-
Save seanlilmateus/bf8064978b7d57fe4f0958833e3e282b to your computer and use it in GitHub Desktop.
Unit Testing a SwiftUI Query
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Created by Helge Heß. | |
// Copyright © 2023 ZeeZide GmbH. | |
// | |
import XCTest | |
import UIKit | |
import SwiftData | |
import SwiftUI | |
class SwiftUITestCase: XCTestCase { | |
private lazy var window : UIWindow? = { | |
let window = UIWindow(frame: .init(x: 0, y: 0, width: 720, height: 480)) | |
window.isHidden = false | |
return window | |
}() | |
func constructView<V: View>(_ view: V, | |
waitingFor expectation: XCTestExpectation) throws | |
{ | |
let window = try XCTUnwrap(self.window) | |
window.rootViewController = UIHostingController(rootView: view) | |
window.rootViewController?.view.layoutIfNeeded() | |
wait(for: [expectation], timeout: 2) | |
} | |
} | |
final class SwiftQueryTests: SwiftUITestCase { | |
@Model | |
final class Item { | |
var name : String | |
init(name: String) { self.name = name } | |
} | |
private let context : ModelContext? = { | |
guard let container = try? ModelContainer( | |
for: Item.self, | |
ModelConfiguration(inMemory: true) | |
) else { return nil } | |
let context = ModelContext(container) | |
context.insert(Item(name: "One")) | |
context.insert(Item(name: "Two")) | |
context.insert(Item(name: "Three")) | |
return context | |
}() | |
func testFetchCount() throws { | |
let context = try XCTUnwrap(context) | |
class TestResults { | |
var fetchedCount = 0 | |
} | |
struct TestView: View { | |
let results : TestResults | |
let expectation : XCTestExpectation | |
@Query var values : [ Item ] | |
var body: Text { // This must NOT be an `EmptyView`! | |
results.fetchedCount = values.count | |
expectation.fulfill() | |
return Text(verbatim: "Dummy") | |
} | |
} | |
let expectation = XCTestExpectation(description: "Test Query Count") | |
let results = TestResults() | |
let view = TestView(results: results, expectation: expectation) | |
.modelContext(context) | |
try constructView(view, waitingFor: expectation) | |
#if false // this crashes the 15b6 compiler | |
XCTAssertEqual(results.fetchedCount, 3) | |
#else | |
XCTAssertTrue(results.fetchedCount == 3) | |
#endif | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment