Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何从联合收割机框架中对按钮进行单元测试?_Swift_Unit Testing_Combine - Fatal编程技术网

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进行欺骗。然后,它当然会工作,但不会像它应该的那样。检查答案更新您提供的两个答案不起作用。请先测试您的代码,并适当更新您的答案。