Swift 如何从联合收割机框架中对按钮进行单元测试?
我使用Swift 如何从联合收割机框架中对按钮进行单元测试?,swift,unit-testing,combine,Swift,Unit Testing,Combine,我使用PassthroughSubject()设置了一个简单的按钮。我正在尝试对它的结果进行单元测试,但无法找出如何使其工作。DispatchQueue正在延迟操作,但在添加expection.fulfill()时,我没有成功 如何对button.send()操作进行单元测试 下面是一个带有按钮定义和操作的简单视图模型类 import Combine import Foundation class StackOverflowViewModel { private var subscrip
PassthroughSubject()
设置了一个简单的按钮。我正在尝试对它的结果进行单元测试,但无法找出如何使其工作。DispatchQueue正在延迟操作,但在添加expection.fulfill()
时,我没有成功
如何对button.send()操作进行单元测试
下面是一个带有按钮定义和操作的简单视图模型类
import Combine
import Foundation
class StackOverflowViewModel {
private var subscriptions = Set<AnyCancellable>()
var mainButtonTap = PassthroughSubject<Void, Never>()
@Published var showAlert = false
init() {
setupCombinePipelines()
}
func setupCombinePipelines() {
mainButtonTap
.receive(on: DispatchQueue.main)
.sink { [weak self] in
guard let self = self else { return }
self.showAlert = true }
.store(in: &subscriptions)
}
}
导入联合收割机
进口基金会
类StackOverflowViewModel{
私有变量订阅=Set()
var mainbuttonap=PassthroughSubject()
@已发布的var showAlert=false
init(){
SetupCombinePiline()
}
函数设置组合线(){
主按钮
.receive(在:DispatchQueue.main上)
.陷入{[虚弱的自我]
guard let self=self-else{return}
self.showAlert=true}
.store(位于:&订阅中)
}
}
XCTestCase子类,其中我未能测试按钮点击结果:
import XCTest
import Combine
@testable import StackOverflow
class StackOverflowViewModelTests: XCTestCase {
var sut: StackOverflowViewModel!
var subscriptions: Set<AnyCancellable>!
override func setUp() {
super.setUp()
sut = StackOverflowViewModel()
subscriptions = Set<AnyCancellable>()
}
override func tearDown() {
subscriptions = []
sut = nil
super.tearDown()
}
func testButtonTap_returnShowAlertTrue() {
sut.showAlert = false
sut.mainButtonTap.send()
let result = sut.showAlert
XCTAssertTrue(result) // return an error
}
}
导入XCTest
进口联合收割机
@可测试导入堆栈溢出
类StackOverflowViewModelTests:XCTestCase{
var sut:StackOverflowViewModel!
变量订阅:设置!
覆盖函数设置(){
super.setUp()
sut=StackOverflowViewModel()
订阅=集()
}
重写函数拆卸(){
订阅=[]
sut=零
super.tearDown()
}
func testButtonTap_returnShowAlertTrue(){
sut.showart=false
sut.mainbuttonap.send()
让结果=sut.showart
xctasertrue(result)//返回一个错误
}
}
您可以使用expectation
和waitforexpections
来测试异步调用
func testButtonTap_returnShowAlertTrue() {
sut.showAlert = false
// create the expectation
let exp = expectation(description: "show alert")
// call async method
sut.mainButtonTap.send()
// wait before method works
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
if self.sut.showAlert {
// when it finishes, mark expectation as being fulfilled
exp.fulfill()
}
}
// wait one second for all outstanding expectations to be fulfilled
waitForExpectations(timeout: 0.2)
}
另一个:
func testbuttonap\u returnShowAlertTrue(){
sut.showart=false
//创造期望
let expect=期望值(说明:“显示警报”)
//定义结果
var结果=错误
//执行异步调用
sut.mainbuttonap.send()
//在警报发布服务器上订阅
//UPD:检查publisher的结果
sut.$showAlert.sink(receiveCompletion:{uuin},receiveValue:{value in}
//实现期望
结果=值
expect.fulfill()
})
.store(位于:&订阅中)
//等等
WaitForExpections(超时:1)
//断言结果
xctasertrue(result)//返回一个错误
}
第一个示例似乎是正确的,但您没有断言结果,因此它不是测试。对于第二个示例,您通过在expection.fulfill()
之后将值设置为true进行欺骗。然后,它当然会工作,但不会像它应该的那样。检查答案更新您提供的两个答案不起作用。请先测试您的代码,并适当更新您的答案。