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]))
        }
    }