我们目前正在为ViewModel实现单元测试。
当一个requestInAppPayment Input请求从视图模型传入时,只有当示例属性isPurchasing过滤器为false时才会实现订阅(以防止多次触摸购买按钮)。
我想写一个测试用例的过滤器时,购买按钮被按下,而购买正在进行中,但我不知道如何做到这一点。
我想写一个测试用例,当购买按钮被点击而购买正在进行时,它会进行过滤。
在ViewMode下
requestInAppPayment
.filter { [weak self] _ in
self?.isPurchasing == false
}
.subscribe(with: self, onNext: { owner, inAppPayment in
owner.isPurchasing = true
owner.showIndicator.onNext(())
owner.requestInAppPurchaseUseCase.execute(productID: inAppPayment.productID)
})
.disposed(by: disposeBag)
requestInAppPurchaseUseCase.purchaseSuccess
.do(onNext: { [weak self] _ in
self?.isPurchasing = false
self?.hideIndicator.onNext(())
})
单元测试中
let observer = scheduler.createObserver(String.self)
let stubPaymentItem = InAppPayment()
scheduler.createHotObservable([
.next(10, stubPaymentItem),
.next(20, stubPaymentItem)
])
.bind(to: viewModel.input.requestInAppPurchase)
.disposed(by: disposeBag)
viewModel.output.showPaymentResultPage
.map { "success" }
.drive(observer)
.disposed(by: disposeBag)
scheduler.start()
// result = [.next(10, "success"), .next(20, "success")],
// The logic I think is [.next(10, "success")]
XCTAssertEqual(observer.events, [
.next(10, "success")
])
1条答案
按热度按时间pxiryf3j1#
下面是一个完整的工作示例,它基于您仅提供的一点单元测试。我根本没有使用您的视图模型代码,我只是编写了一个通过测试的视图模型。
我使用了我在这里提供的测试工具:https://gist.github.com/danielt1263/bd449100764e3166644f7a38bca86c96
下面是使上述工作的生产代码: