2

I am using Quick, Nimble, and RxSwift.

My goal is to write unit test that test some function with Timer on it which will be executed repeatedly after some time interval.

My pseudo class

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)
    }
}

My testing class

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)
                }
            }
        }
    }
}

I expect that executeFunction() will be called after 8 second, however it is never called and my test suite is failed.

Any idea what went wrong?

seto nugroho
  • 1,359
  • 1
  • 13
  • 20

1 Answers1

1

You should reduce your Nimble polling interval because your polling is occur every per 2 seconds to compare your testing class counter value to expected value '1' is per every 2 seconds.

expect for 9 seconds(timeout) but your last polling ended after exactly 8 seconds polling.

Increase your timeout more than 10 seconds or Reduce your polling interval to compare expected value before timeout.

In advance

You can reduce your totally testing time by injecting time interval or using RxTest

Cruz
  • 2,602
  • 19
  • 29