在单元测试中,如何在没有外部库的情况下断言 PassthroughSubject 值?
On unit test, How does assert the PassthroughSubject value without an external library?
请帮助我,我想测试 viewModel
,当我进行 运行 单元测试时出现错误 Asynchronous wait failed: Exceeded timeout of 1 second
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))
}
}
}
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]))
}
}
您需要在调用viewModel.fetchUsers()
之前调用viewModel.usersSubject.sink
,以便视图模型调用usersSubject.send
时存在订阅。
请帮助我,我想测试 viewModel
,当我进行 运行 单元测试时出现错误 Asynchronous wait failed: Exceeded timeout of 1 second
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))
}
}
}
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]))
}
}
您需要在调用viewModel.fetchUsers()
之前调用viewModel.usersSubject.sink
,以便视图模型调用usersSubject.send
时存在订阅。