RxSwift单元测试

dlo*_*omb 3 unit-testing ios swift rx-swift

我有一个简单的RxSwift Observable序列,我试图进行单元测试.

    var pass = false
    _ = service!.authenticate().subscribeNext { res in
        XCTAssert(res.tokenValue == "abc123")
        pass = true
    }
    XCTAssertTrue(pass)
Run Code Online (Sandbox Code Playgroud)

此测试将间歇性地失败,就好像subscribeNext块不总是被命中一样.关于我做错了什么的任何想法?

编辑1

此身份验证调用只是返回静态JSON数据,实际上并没有访问网络.

mok*_*gio 8

您的问题很可能是由于以下两个问题之一:

  1. 测试击中了网络
  2. 测试以同步方式编写,但测试的行为是异步的.

关于在测试中点击网络:这通常是一个坏主意,除非您正在进行集成测试.网络不可靠,可能会超时或失败.您可以在此处找到有关为什么在测试中点击网络不是一个好主意的更多信息.

关于异步测试:发生的事情是,在observable发送下一个事件之前,您的断言是由测试执行的.

您可以像这样重写您的测试:

让service = SomeService()

let expectation = expectationWithDescription("subscribeNext called")

_ = service!.authenticate().subscribeNext { res in
    XCTAssert(res.tokenValue == "abc123")
    expectation.fulfill()
}

waitForExpectationsWithTimeout(1) { error in
  if let error = error {
    XCTFail("waitForExpectationsWithTimeout errored: \(error)")
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关异步测试的更多信息.