Swift 单元测试计时器?

Swift 单元测试计时器?,swift,asynchronous,time,timer,Swift,Asynchronous,Time,Timer,我想测试一下信号是否每6秒被触发一次。我的代码如下所示: class DataStore { var clinics: Int { return clinicsSignal.lastDataFired ?? 0 } let clinicsSignal = Signal<Int>(retainLastData: true) var timer: Timer? init() { } func load() {

我想测试一下信号是否每6秒被触发一次。我的代码如下所示:

class DataStore {

    var clinics: Int { return clinicsSignal.lastDataFired ?? 0 }    
    let clinicsSignal = Signal<Int>(retainLastData: true)
    var timer: Timer?

    init() {
    }

    func load() {

        self.clinicsSignal.fire(0)

        DispatchQueue.main.async { [weak self] in
            self!.timer?.invalidate()
            self!.timer = Timer.scheduledTimer(withTimeInterval: 6.0, repeats: true) { [weak self] _ in
                self?.clinicsSignal.fire(9)
            }
        }
    }
}
func testRefresh() {

    var dataStore: DataStore = DataStore()

    dataStore.clinicsSignal.subscribeOnce(with: self) {
        print("clinics signal = \($0)")
        dataStore.clinicsSignal.fire(0)
    }

    dataStore.load()

    sleep(30)

    print("clinics3 = \(dataStore.clinics)")

}

当我睡眠30秒时,计时器代码直到30秒后才会再次运行,因此它不会像预期的那样每6秒运行一次。关于如何在计时器中测试该代码的任何想法都会在特定时间被击中吗?谢谢。

睡眠功能会阻止线程,计时器与线程关联。 您应该使用
期望值

func testRefresh(){
var dataStore:dataStore=dataStore()
让expec=expection(说明:“计时器期望”)//创建一个期望
dataStore.clinicsSignal.subscribeOnce(带:self){
打印(“诊所信号=\($0)”)
数据存储.clinicsSignal.fire(0)
expec.fulfill()//告诉他们一切都完成了
}
dataStore.load()
wait(for:[expec],timeout:7.0)//等待满足每个期望(在本例中只有一个),timeout必须大于计时器间隔
}

睡眠功能会阻止线程,计时器与线程关联。 您应该使用
期望值

func testRefresh(){
var dataStore:dataStore=dataStore()
让expec=expection(说明:“计时器期望”)//创建一个期望
dataStore.clinicsSignal.subscribeOnce(带:self){
打印(“诊所信号=\($0)”)
数据存储.clinicsSignal.fire(0)
expec.fulfill()//告诉他们一切都完成了
}
dataStore.load()
wait(for:[expec],timeout:7.0)//等待满足每个期望(在本例中只有一个),timeout必须大于计时器间隔
}

为什么你的课程是期末考试?@RicoCrescenzio会有什么不同@好问题。我刚把它拿出来。我不知道为什么会这样。这有关系吗:?为什么你的课程是期末考试?@RicoCrescenzio会有任何不同@好问题。我刚把它拿出来。我不知道这是为什么。这是否相关:?也许我的代码不能解决您的问题(因为我注意到它有点复杂),但一般的方法是在处理异步测试时,也许我的代码不能解决您的问题(因为我注意到它有点复杂),但是在处理异步测试时,一般的方法是这样的