Skip to content

Instantly share code, notes, and snippets.

View djds23's full-sized avatar

Dean Silfen djds23

View GitHub Profile
//
// FollowUserViewModel.swift
// YourFavoriteInstruments
//
// Created by Dean Silfen on 2/2/19.
// Copyright © 2019 Dean Silfen. All rights reserved.
//
import RxSwift
import RxCocoa
final class FollowUserViewModel {
// same properties as above
init(
networkHandler: FollowNetworkHandler, 
scheduler: SchedulerType // inject a scheduler type to the initializer
) {
followSubject
.observeOn(scheduler)
// transformation 
.disposed(by: disposeBag)
class FollowerViewModelTest: XCTestCase {
// retain subscriptions while testing
let disposeBag = DisposeBag()
func testFollowersUpdate() {
let testFollower = User()
let mockNetworking = FollowerNetworkingMock(
mockFollowers: [testFollower], 
followResponse: .success
)
class FollowerViewModelTest: XCTestCase {
let disposeBag = DisposeBag()
func testFollowersUpdate() {
let testFollower = User()
let mockNetworking = FollowerNetworkingMock(mockFollowers: [testFollower])
// Create a scheduler that starts at 0
let scheduler = TestScheduler(initialClock: 0)
let viewModel = FollowUserViewModel(networkHandler: mockNetworking, scheduler: scheduler)
let testCountObserver = scheduler.createTestObserver(Int.self)
let testLatestFollowObserver = scheduler.createTestObserver(User.self)
/// Any old user class
class User { … }
/// Response enum to notify us about a success or failure
enum Response {
  case success
  case fail(Error)
}
/// Types that implement this protocol 
struct FollowerNetworkingMock: FollowNetworkHandler {
let mockFollowers: [User]
let followResponse: Response
func follow(user: User) -> Observable<Response> {
return .just(followResponse)
}
func followers() -> Observable<[User]> {
return .just(mockFollowers)
}
}
func simpleCombineStreams(
resource: Observable<Bool>,
buttonTap: Observable<Void>
) -> Observable<Bool> {
return buttonTap
.withLatestFrom(resource)
}
func waitForResourceAndButtonTap(
resource: Observable<Bool>,
buttonTap: Observable<Void>
) -> Observable<Bool> {
let emitOnlyAfterResourceHasArrived = Observable
.combineLatest(
buttonTap,
resource.take(1)
)
enum TrainLine { … }
enum TrainStation { … }
protocol TrainNetworkHandler {
func departureTime(forLine: TrainLine, departingFrom: TrainStation) -> Observable<Date>
}
class TrainDepartureService {
func departureTimes(forLine: TrainLine, departingFrom: TrainStation) -> Observable<Date> {
return Observable<TimeInterval>.timer(0, period: 60, scheduler: scheduler)
.flatMapLatest { _ -> Observable<Date> in
network.departureTime(forLine: forLine, departingFrom: departingFrom)
}
}
private let scheduler: SchedulerType