CocoaPods trunk is moving to be read-only. Read more on the blog, there are 19 months to go.

RxExpect 2.0.0

RxExpect 2.0.0

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Jun 2019
SPMSupports SPM

Maintained by Suyeol Jeon.



 
Depends on:
RxSwift~> 5.0
RxCocoa~> 5.0
RxTest~> 5.0
 

RxExpect 2.0.0

  • By
  • Suyeol Jeon

RxExpect

Swift CocoaPods Build Status Codecov

RxExpect is a testing framework for RxSwift.

Concept

Provide inputs then test outputs. This is an example code that tests map() operator multiplying the values by 2.

func testMultiply() {
  let test = RxExpect()
  let value = PublishSubject<Int>()
  let result = value.map { $0 * 2 }

  // provide inputs
  test.input(value, [
    next(100, 1),
    next(200, 2),
    next(300, 3),
    completed(400)
  ])
  
  // test output
  test.assert(result) { events in
    XCTAssertEqual(events, [
      next(100, 2),
      next(200, 4),
      next(300, 6),
      completed(400)
    ])
  }
}

It would be easy to understand if you imagine the marble diagram.

time   --100-200-300-400 // virtual timeline
value  --1---2---3---|   // provide inputs
result --2---4---6---|   // test these values

This is more complicated example.

final class ArticleDetailViewModelTests: XCTestCase {
  func testLikeButtonSelected() {
    let test = RxExpect()
    let viewModel = ArticleDetailViewModel()
    test.retain(viewModel) // IMPORTANT: prevent from being disposed while testing

    // providing an user input: user tapped like button
    test.input(viewModel.likeButtonDidTap, [
      next(100, Void()),
    ])

    // test output: like button become selected
    test.assert(viewModel.isLikeButtonSelected) { events in
      XCTAssertEqual(events.at(100...).elements, [true])
    }
  }

  func testLikeButtonUnselected() {
    let test = RxExpect()
    let viewModel = ArticleDetailViewModel()
    test.retain(viewModel) // IMPORTANT: prevent from being disposed while testing

    // providing an user input: user tapped like button
    test.input(viewModel.likeButtonDidTap, [
      next(100, Void()),
    ])

    // test output: like button become selected
    test.assert(viewModel.isLikeButtonSelected) { events in
      XCTAssertEqual(events.at(100...).elements, [false])
    }
  }
}

Examples

APIs

Providing Inputs

  • input(observer, events)
  • input(variable, events)

Start Assertion Chaining

  • assert(source, closure)

Installation

  • For iOS 8+ projects with CocoaPods:

    pod 'RxExpect'
  • For iOS 8+ projects with Carthage:

    github "devxoul/RxExpect"
    

Development

$ swift package generate-xcodeproj
$ open RxExpect.xcodeproj

License

RxExpect is under MIT license. See the LICENSE file for more info.