Модульное тестирование таймера? - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу проверить, что сигнал срабатывает каждые 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 секунд, как это должно быть. Любая идея о том, как проверить этот код в таймере, получает удар в определенное время? Спасибо.

1 Ответ

2 голосов
/ 26 апреля 2019

Функция sleep блокирует ваш поток, а таймеры связаны с потоками.Вы должны использовать expectation.

func testRefresh() {

    var dataStore: DataStore = DataStore()
    let expec = expectation(description: "Timer expectation") // create an expectation
    dataStore.clinicsSignal.subscribeOnce(with: self) {
        print("clinics signal = \($0)")
        dataStore.clinicsSignal.fire(0)
        expec.fulfill() // tell the expectation that everything's done
    }

    dataStore.load()
    wait(for: [expec], timeout: 7.0) // wait for fulfilling every expectation (in this case only one), timeout must be greater than the timer interval
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...