RxExpect 0.7.0

RxExpect 0.7.0

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release May 2017
SwiftSwift Version 3.1
SPMSupports SPM

Maintained by Suyeol Jeon.


Downloads

Total4,196
Week72
Month407

Installs

Apps3
Test Targets98
Test WeekTests This week 12
powered by Segment

GitHub

Stars59
Watchers5
Forks5
Issues1
Contributors3
Pull Requests0

Code

Files11
LOCLines of Code 415


 
Depends on:
RxSwift>= 3.4
RxCocoa>= 3.4
RxTest>= 3.4
 

RxExpect 0.7.0

  • By
  • Suyeol Jeon

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() {
  RxExpect("it should multiply values by 2") { test in
    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)
      .equal([
        next(2),
        next(4),
        next(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: RxTestCase {

  func testLikeButtonSelected() {
    RxExpect("like button should become selected when like button tapped") { test in
      let viewModel = ArticleDetailViewModel()

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

      // test output: like button become selected
      test.assert(viewModel.isLikeButtonSelected)
        .filterNext()
        .since(100)
        .equal([true])
    }
    
    RxExpect("like button should become unselected when like button tapped") { test in
      let viewModel = ArticleDetailViewModel()

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

      // test output: like button become selected
      test.assert(viewModel.isLikeButtonSelected)
        .filterNext()
        .since(100)
        .equal([false])
    }
  }

}

Examples

APIs

Providing Inputs

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

Start Assertion Chaining

  • assert(source)

Filtering Events

  • filterNext()
  • since(timeSince)
  • until(timeUntil)
  • within(timeRange)

Reversing Result

  • not()

Assertions

  • equal(expectedEvents)
  • isEmpty()
  • contains()
  • count()

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.