Skip to content

Instantly share code, notes, and snippets.

@thepearl
Created December 12, 2022 00:04
Show Gist options
  • Save thepearl/0acd55bc7dd30f2c764bcec10e363e98 to your computer and use it in GitHub Desktop.
Save thepearl/0acd55bc7dd30f2c764bcec10e363e98 to your computer and use it in GitHub Desktop.
class MyViewModelTests: XCTestCase {
func testFetchData() {
let dataFetcher = MockDataFetcher()
let viewModel = MyViewModel(dataFetcher: dataFetcher)
let expectation = XCTestExpectation(description: "Fetch data")
dataFetcher.fetchDataResult = "test data"
viewModel.fetchData()
let cancellable = viewModel.dataPublisher
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
XCTFail("Publisher failed with error: \(error)")
}
}, receiveValue: { value in
XCTAssertEqual(value, "test data")
})
expectation.fulfill()
wait(for: [expectation], timeout: 1.0)
}
}
class MockDataFetcher: DataFetcher {
var fetchDataResult: String?
func fetchData() -> AnyPublisher<String, Error> {
if let result = fetchDataResult {
return Just(result)
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
} else {
return Fail(error: MockError.unknown)
.eraseToAnyPublisher()
}
}
}
enum MockError: Error {
case unknown
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment