提问人:Cyklist 提问时间:11/11/2023 更新时间:11/13/2023 访问量:18
Xcode 和 Swift 单元测试 使用 ViewInspector 异步查看超时
Xcode and Swift unit testing View asynchronously using ViewInspector times out
问:
我正在使用 Xcode 15.0.1 构建一个 swift 包,这不是一个项目。当下面的测试超时并且它没有在线路上运行闭包时,我遇到了失败。仅供参考,我在我的包中的其他测试中都有这个工作。wait
test.on(\.didAppear)
在我的 Package.swift 文件中,我有以下内容。
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyLibrary",
platforms: [
.iOS(.v16)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(name: "MyLibrary", targets: ["MyLibrary"])
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.0.0"),
.package(url: "https://github.com/realm/SwiftLint.git", from: "0.53.0"),
.package(url: "https://github.com/nalexn/ViewInspector.git", from: "0.9.8")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "MyLibrary",
dependencies: [],
resources: [
.process("Media.xcassets")
],
plugins: [
.plugin(name: "SwiftLintPlugin", package: "SwiftLint")
]
),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary", "ViewInspector"])
]
)
下面是一个无法运行的代码。它与我的包中的代码的基本结构相同。
import SwiftUI
import ViewInspector
import XCTest
@testable import MyLibrary
final class MyTests: XCTestCase {
struct TestView: View {
@Binding var text: String
@State var display: String = ""
internal var didAppear: ((Self) -> Void)?
init(text: String) {
self._text = Binding<String>.init(wrappedValue: text)
}
var body: some View {
HStack {
Text("Hello")
Text(display)
}
.onChange(of: text, perform: { value in
self.display = value
})
}
}
func testTest() throws {
var test = TestView(text: "")
let exp = test.on(\.didAppear) { view in
try view.hStack().callOnChange(newValue: "World")
XCTAssertNotNil(try view.hStack().find(text: "World"))
}
ViewHosting.host(view: test)
wait(for: [exp], timeout: 1.0) // <- Fails here with a timeout
}
}
我在上面的测试中使用了与代码中相同的更新机制。onChange
答:
0赞
Cyklist
11/13/2023
#1
我找到了问题的答案。变量中缺少一行。它应该包括 .因此,TestView 应为:var body: some View
.onAppear { self.didAppear?(self) }
struct TestView: View {
@Binding var text: String
@State var display: String = ""
internal var didAppear: ((Self) -> Void)?
init(text: String) {
self._text = Binding<String>.init(wrappedValue: text)
}
var body: some View {
HStack {
Text("Hello")
Text(display)
}
.onChange(of: text, perform: { value in
self.display = value
})
.onAppear { self.didAppear?(self) } // <- this was missing
}
}
否则,从不设置,并且该函数没有什么可“等待”的。exp
wait
评论