【发布时间】:2022-01-20 09:45:36
【问题描述】:
我对 RxSwift 很陌生,我正在尝试创建一些单元测试。在这种情况下,我想测试从实时数据库 Firebase 获取对象是否正确发生。
func getAllPosts() -> Observable<[PostItem]> {
ref = Database.database().reference()
return Observable.create { observer -> Disposable in
self.ref.child("Posts").observe(.value) { (snapshot) in
var postsList:[PostItem] = []
for child in snapshot.children {
let snap = child as! DataSnapshot
let postDict = snap.value as! [String: Any]
let postAux = PostItem(id: snap.ref.key ?? "", authorId: postDict["authorId"] as? String ?? "", name: postDict["name"] as? String ?? "", content: postDict["content"] as? String ?? "", createAt: postDict["createAt"] as? String ?? "")
postsList.append(postAux)
}
observer.onNext(postsList)
}
return Disposables.create {}
}
}
问题是firebase的返回是异步的,我尝试测试的方式在返回之前完成。
func testFetchPosts() throws {
let newsAPIService = NewsAPIService()
let posts = newsAPIService.fetchNewsFromAPI()
XCTAssertNil(posts, "The posts is nil")
}
Obs:我尝试使用 XCTest 期望,但我不知道是否实现不正确或者它是否真的不起作用
谢谢!
【问题讨论】:
-
副作用(即 Firebase)不应出现在单元测试中。假设 Firebase 工作正常。
-
当您在一次性操作中无事可做时,请使用
Disposables.create()而不是Disposables.create { }。前者将返回一个静态的 nil-disposable 对象,而后者将返回一个新创建的对象。但在这种情况下,您可能应该使用ref来关闭observe(.value)。有ref.cancel()或ref.stop()方法吗?
标签: swift unit-testing rx-swift xctest rxtest