我有一个模态呈现的Sheet
应该基于UserDefault
bool显示。我写了一个UI-Test,它会关闭表单,我使用启动参数来控制默认值。
然而,当我最初尝试使用@AppStorage
时,它似乎没有坚持值,或者秘密地不写它?我的测试失败了,因为在"解散"后,模态会弹出,因为值不变。
有谁知道我不明白什么,对不起?
干杯!
<标题>简单例子1。AppStorage
struct ContentView: View {
@AppStorage("should.show.sheet") private var binding: Bool = true
var body: some View {
Text("Content View")
.sheet(isPresented: $binding) {
Text("Sheet")
}
}
}
2。定制绑定:
struct ContentView: View {
var body: some View {
let binding = Binding<Bool> {
UserDefaults.standard.bool(forKey: "should.show.sheet")
} set: {
UserDefaults.standard.set($0, forKey: "should.show.sheet")
}
Text("Content View")
.sheet(isPresented: binding) {
Text("Sheet")
}
}
}
测试用例:
final class SheetUITests: XCTestCase {
override func setUpWithError() throws {
continueAfterFailure = false
}
func testDismiss() {
// Given 'true' userdefault value to show sheet on launch
let app = XCUIApplication()
app.launchArguments += ["-should.show.sheet", "<true/>"]
app.launch()
// When the user dismisses the modal view
app.swipeDown()
// Wait a second for animation (make sure it doesn't pop back)
sleep(1)
// Then the sheet should not be displayed
XCTAssertFalse(app.staticTexts["Sheet"].exists)
}
}
标题>-
即使在运行应用程序时也不工作,因为";在键名(看起来这是AppStorage的限制,所以使用简单的符号,如
isSheet
) -
IMO测试用例是不正确的,因为它覆盖了默认参数域,但它是只读的,所以写入是尝试到持久域,但那里可能有相同的值,所以没有更改(读取
didSet
)事件生成,所以没有更新UI。 -
要测试这一点,应该在应用程序中的配对事件,即。一个给
AppStorage
值true,另一个给false
*注意:布尔值在参数中表示为0/1(不是XML),如-isSheet 1