如何解决如何在不同环境下为 SwiftUI App 生命周期应用程序运行 UI 测试?
我正在尝试弄清楚如何为使用“SwiftUI 应用程序生命周期”和预览数据的 SwiftUI 应用程序运行 UI 测试 - 特别是 CoreData 的一些数据,但它可能更通用。
在 SwiftUI 应用程序生命周期中,我们知道有“主要”入口点,例如:
@main
struct MyApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedobjectContext,persistenceController.container.viewContext)
}
}
}
其中 PersistenceController
是管理 CoreData 内容的结构(如果您只是创建一个新应用程序并选择“使用 CoreData”,则此示例由 Apple 的模板创建)。我编写了一个带有一堆预览数据的扩展程序,只需在视图代码等上设置不同的 PreviewProvider
和 managedobjectContext
即可轻松加载到 .environment()
中,以便在开发时使用界面代码。
有没有办法让这个预览数据在 UI 测试中可用?我们通常有看起来像这样的 UI 测试代码:
class MyUITests: XCTestCase {
var app: XCUIApplication!
override func setUpWithError() throws {
app = XCUIApplication()
app.launch()
continueAfterFailure = false
}
func testTabBarButtonsAndNavTitles() throws {
let tabBar = app.tabBars["Tab Bar"]
let loadAndGoTabBarButton = tabBar.buttons["Load and go"]
loadAndGoTabBarButton.tap()
XCTAssert(app.navigationBars["Load a thing and do it"].exists)
}
有没有办法告诉 XCUIApplication()
在环境调用启动时使用不同的 managedobjectContext
值?
如果不是 - 似乎测试某些 SwiftUI 元素的唯一方法是让 UI 测试功能首先“轻点”并输入一堆预览数据,但这确实很麻烦。如果应用程序可以启动以使用一些保存的数据进行测试会更好。
很抱歉没有提供完全可运行的代码段来说明这一点,但它需要大量基础设施和样板等。感谢您对此的任何想法!
解决方法
您可能想尝试的选项:
- 您可以将参数传递给应用程序(通过
XCUIApplication.launchArguments
)。您可以从Process.arguments
或UserDefaults
读取参数(默认值可以指定为参数)。 - 您可以在设备上填充测试数据库,然后转储应用程序数据容器(请参阅 https://www.codementor.io/@paulzabelin/xcode-app-data-suni6p4ma 以获取教程)并在您的 UI 测试中使用该容器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。