Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 

README.md

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.

You can’t perform that action at this time.