我有一个简单的RxSwift Observable序列,我试图进行单元测试。
var pass = false
_ = service!.authenticate().subscribeNext { res in
XCTAssert(res.tokenValue == "abc123")
pass = true
}
XCTAssertTrue(pass)
此测试将间歇性地失败,就好像并不总是命中了subscribeNext块一样。关于我做错了什么想法?
修改1
此身份验证调用只是返回静态JSON数据,实际上并没有访问网络。
答案 0 :(得分:8)
您的问题很可能是由于这两个问题中的任何一个:
关于在测试中点击网络:这通常是一个坏主意,除非您正在进行集成测试。网络不可靠,可能会超时或失败。您可以找到有关为什么在测试中点击网络不是一个好主意的更多信息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。