gpt4 book ai didi

swift - 我如何断言使用最新文本输入的可观察对象的输出

转载 作者:行者123 更新时间:2023-11-28 05:39:29 25 4
gpt4 key购买 nike

我的 View 模型有一个属性:

    let isValid: Driver<Bool>
let credentials: Driver<(String, String)>
......
credentials = .combineLatest(bindings.username, bindings.password, resultSelector: { (username, password) -> (String, String) in (username, password) })

isValid = credentials.map { username, password in username.count > 0 && password.count > 7 }

我想断言,当设置了有效输入时,isValid 设置了正确的状态。

我的测试在下方通过,但是感觉这不是测试此场景的正确方法。

理想情况下,我希望我的字符串以 "" 开头,然后传入值,就好像它们已被键入一样,这样我就可以断言默认状态已设置,然后更改。

我也找到了这些行:

   .do(onNext: { state in
if state {
exp.fulfill()
}
})

有点“hacky”。​​

   func test_is_valid_state_changes_when_inputs_correct_length() {

let username: Driver<String> = .of("some_user_name")
let password: Driver<String> = .of("some_user_password")

let bindings = LoginViewModel.Bindings(username: username, password: password, loginTap: .empty(), doneTap: .empty())
let sut = LoginViewModel(dependency: "", bindings: bindings)

let scheduler = TestScheduler(initialClock: 0)
let observer = scheduler.createObserver(Bool.self)

let exp = expectation(description: "isValid Event")

sut.isValid
.asObservable()
.do(onNext: { state in
if state {
exp.fulfill()
}
})
.subscribe(observer)
.disposed(by: disposeBag)

scheduler.start()

waitForExpectations(timeout: 0.5) { error in
XCTAssertNil(error)
XCTAssertEqual(observer.events.count, 1)
XCTAssertTrue(observer.events[0].value.element!) // swiftlint:disable:this force_unwrapping
}
}

最佳答案

您需要使用 TestObservables 来进行您想要的测试,并且您不需要期望对象,因为该测试将在没有任何线程问题的情况下完成。

    func test_is_valid_state_changes_when_inputs_correct_length() {
let scheduler = TestScheduler(initialClock: 0)

let username = scheduler.createHotObservable([.next(0, ""), .next(10, "h")])
let password = scheduler.createHotObservable([.next(0, ""), .next(30, "p"), .next(40, "passwor"), .next(50, "password")])

let bindings = LoginViewModel.Bindings(
username: username.asDriver(onErrorRecover: { _ in XCTFail(); return .empty() }),
password: password.asDriver(onErrorRecover: { _ in XCTFail(); return .empty() }),
loginTap: .empty(),
doneTap: .empty()
)
let disposeBag = DisposeBag()
let sut = LoginViewModel(dependency: "", bindings: bindings)

let observer = scheduler.createObserver(Bool.self)

sut.isValid
.drive(observer)
.disposed(by: disposeBag)

scheduler.start()

XCTAssertEqual(observer.events, [
.next(0, false),
.next(10, false),
.next(30, false),
.next(40, false),
.next(50, true)
])

}

关于swift - 我如何断言使用最新文本输入的可观察对象的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57370348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com