Skip to content

Instantly share code, notes, and snippets.

@pietrocaselani
Last active June 4, 2018 16:44
Show Gist options
  • Save pietrocaselani/0e375288032dc4b67cf749810b40be6f to your computer and use it in GitHub Desktop.
Save pietrocaselani/0e375288032dc4b67cf749810b40be6f to your computer and use it in GitHub Desktop.
import RxSwift
import RxTest
import XCTest
@testable import ExampleFramework
final class MoviesDefaultViewModelTests: XCTestCase {
private var scheduler: TestScheduler!
private var observer: TestableObserver<MovieViewState>!
private var disposeBag: DisposeBag!
override func setUp() {
super.setUp()
scheduler = TestScheduler(initialClock: 0)
observer = scheduler.createObserver(MovieViewState.self)
disposeBag = DisposeBag()
}
override func tearDown() {
disposeBag = nil
observer = nil
scheduler = nil
super.tearDown()
}
func testMoviesDefaultViewModel_viewState_shouldAlwaysStartsWithLoading() {
let repository = MoviesMocks.SuccessRespository()
let viewModel = MoviesDefaultViewModel(repository: repository)
viewModel.observeViewState().subscribe(observer).disposed(by: disposeBag)
viewModel.viewDidLoad()
scheduler.start()
let expectedViewState = Recorded.next(0, MovieViewState.loading)
guard let firstViewState = observer.events.first else {
XCTFail("Should contain at least one result")
return
}
XCTAssertEqual([firstViewState], [expectedViewState])
}
func testMoviesDefaultViewModel_cantEmitSameViewState() {
let emptyMovies = [String]()
let repository = MoviesMocks.SuccessRespository(titles: emptyMovies)
let viewModel = MoviesDefaultViewModel(repository: repository)
viewModel.observeViewState().subscribe(observer).disposed(by: disposeBag)
viewModel.viewDidLoad()
scheduler.start()
repository.emit(new: emptyMovies)
let expectedEvents = [Recorded.next(0, MovieViewState.loading),
Recorded.next(0, MovieViewState.empty)]
XCTAssertEqual(observer.events, expectedEvents)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment