Модульное тестирование быстрой функции таймера с использованием nimble

Я использую Quick, Nimble и RxSwift.

Моя цель - написать модульный тест, который проверяет некоторую функцию с таймером, которая будет выполняться повторно через некоторый интервал времени.

Мой псевдокласс

final class TestingTimerClass {
    let counter: BehaviorRelay<Int> = BehaviorRelay<Int>(value: 0)
    private var timer: Timer?

    ....

    func startTimer() {

        timer = Timer.scheduledTimer(
            timeInterval: 8,
            target: self as Any,
            selector: #selector(self.executeFunction),
            userInfo: nil,
            repeats: true
        )
    }

    @objc private func executeFunction() {
        let currentValue = counter.value
        counter.accept(currentValue + 1)
    }
}

Мой тестовый класс

class TestingTimerClass: QuickSpec {

    override func spec() {
        var testingClass: TestingTimerClass!

        describe("executing") {

            context("startTimer()") {

                beforeEach {
                    testingClass = TestingTimerClass()
                }

                afterEach {
                    testingClass = nil
                }

                it("should update counter value after a period of time") {

                    testingClass.startTimer()
                    expect(testingClass.counter.value).toEventually(equal(1), timeout: TimeInterval(9), pollInterval: TimeInterval(2), description: nil)
                }
            }
        }
    }
}

Я ожидаю, что executeFunction() будет вызван через 8 секунд, однако он никогда не вызывается, и мой тестовый набор не выполнен.

Есть идеи, что пошло не так?


person seto nugroho    schedule 14.05.2020    source источник
comment
вам нужно что-то вроде testingClass.counter.toBlocking().first() использовать RxBlocking для синхронного преобразования асинхронных событий   -  person Sandeep Bhandari    schedule 14.05.2020


Ответы (1)


Вы должны уменьшить интервал опроса Nimble, потому что ваш опрос происходит каждые 2 секунды, чтобы сравнить значение счетчика вашего тестового класса с ожидаемым значением «1» каждые 2 секунды.

ожидать в течение 9 секунд (тайм-аут), но ваш последний опрос закончился ровно через 8 секунд опроса.

Увеличьте время ожидания более чем на 10 секунд или сократите интервал опроса, чтобы сравнить ожидаемое значение до истечения времени ожидания.

Заранее

Вы можете сократить общее время тестирования, введя временной интервал или используя RxTest.

person Cruz    schedule 06.06.2020