RxSwift单元测试

时间:2016-04-29 00:54:30

标签: ios swift unit-testing rx-swift

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

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

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

修改1

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

1 个答案:

答案 0 :(得分:8)

您的问题很可能是由于这两个问题中的任何一个

  1. 测试点击网络
  2. 测试是以同步方式编写的,但测试的行为是异步的。
  3. 关于在测试中点击网络:这通常是一个坏主意,除非您正在进行集成测试。网络不可靠,可能会超时或失败。您可以找到有关为什么在测试中点击网络不是一个好主意的更多信息here

    关于异步测试:发生的事情是你的断言是由之前由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)")
      }
    }
    

    您可以找到有关异步测试的更多信息here