Swift 在单元测试中,如何在没有外部库的情况下断言PassthroughSubject值?
请帮助我,我想在运行单元测试时测试Swift 在单元测试中,如何在没有外部库的情况下断言PassthroughSubject值?,swift,combine,Swift,Combine,请帮助我,我想在运行单元测试时测试viewModel,然后出现错误Asynchronous wait failed:超时超过1秒 var usersSubject = PassthroughSubject<[User],Error>() func fetchUsers(){ let url = URL(string: endpoint.urlString)! apiManager.fetchItems(url: url) { (result:
viewModel
,然后出现错误Asynchronous wait failed:超时超过1秒
var usersSubject = PassthroughSubject<[User],Error>()
func fetchUsers(){
let url = URL(string: endpoint.urlString)!
apiManager.fetchItems(url: url) { (result: Result<[User],Error>) in
switch result {
case .success(let users):
self.usersSubject.send(users)
case .failure(let error):
self.usersSubject.send(completion: .failure(error))
}
}
}
var userssobject=PassthroughSubject()
func fetchUsers(){
让url=url(字符串:endpoint.urlString)!
apimager.fetchItems(url:url){(result:result)在
切换结果{
成功案例(让用户参与):
self.usersObject.send(用户)
案例。失败(let错误):
self.usersObject.send(完成:。失败(错误))
}
}
}
func testsuccess(){
viewModel.UsersObject.sink{在中完成
self.exectation.fulfill()
}receiveValue:{中的用户
xctasertequal(1,users.count)
XCTASERTEQUAL(“你好,世界”,用户[0]。名称)
self.exectation.fulfill()
}
viewModel.fetchUsers()
XCTAssertEqual(1,apiManager.numberOfCalled)
等待(等待:[执行],超时:1.0)
}
类stubapimager:apimager{
变量numberOfCalled=0
重写func fetchItems(url:url,completion:@escaping(Result)->Void),其中T:Decodable{
让用户=[
用户(id:1,名称:“Hello World”)
]
numberOfCalled+=1
完成(.success(用户身份为![T]))
}
}
在调用viewModel.fetchUsers()
之前,您需要调用viewModel.userssobject.sink
,以便在视图模型调用userssobject.send
时订阅存在。谢谢。我正在按照你的建议修改一个测试用例,但这不起作用<代码>顺序为1。调用viewModel.userSubject.sink以断言值2。调用viewModel.fetchUser()您需要编辑问题以显示代码的新版本。好的,我知道了。请再次查看编译器为您当前的代码提供了警告,而您忽略了该警告。你需要注意它。您还可以查看更多信息。
func testsuccess(){
viewModel.usersSubject.sink { completion in
self.exectation.fulfill()
} receiveValue: { users in
XCTAssertEqual(1, users.count)
XCTAssertEqual("Hello World", users[0].name)
self.exectation.fulfill()
}
viewModel.fetchUsers()
XCTAssertEqual(1, apiManager.numberOfCalled)
wait(for: [exectation], timeout: 1.0)
}
class StubApiManager: APIManager {
var numberOfCalled = 0
override func fetchItems<T>(url: URL, completion: @escaping (Result<[T], Error>) -> Void) where T : Decodable {
let users = [
User(id: 1, name: "Hello World")
]
numberOfCalled += 1
completion(.success(users as! [T]))
}
}