RxNimble

by RxSwiftCommunity

RxSwiftCommunity / RxNimble

Nimble extensions making unit testing with RxSwift easier :tada:

219 Stars 46 Forks Last release: 7 months ago (4.7.2) MIT License 117 Commits 17 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Build Status

RxNimble

Nimble extensions that make unit testing with RxSwift easier :tada:

If you came here because you want to help out, please check out the contribution guide

Why

RxSwift includes a really nifty little library called RxBlocking which provides convenience functions for peeking in on

Observable
instances. Check is a blocking call, hence the name.

But writing code to check an

Observable
's value is sooooo tedious:
let result = try! observable.toBlocking().first()
expect(result) == 42

With

RxNimble
, we've added Nimble extension for
Observable
s, so the code above can be rewritten as:
expect(observable).first == 42

Nice.

It's also possible to pass a timeout to the blocking operators:

expect(observable).first(timeout: 3) == 42

This extension is also available for all Traits (e.g.

Single
,
Maybe
) and other types conforming to
ObservableConvertibleType
.

If on the other hand you'd rather use RxTest instead of

RxBlocking
, you can do it by specifying RxNimble's
RxTest
subspec. With RxTest you can have more powerful tests, checking a stream as a whole instead of being limited to
first
,
last
and
array
(while the last 2 implicitly require the stream to have completed).

That means RxTest allows you to verify the occurrence of multiple

next
,
error
and
completed
events at specific virtual times:
expect(subject).events(scheduler: scheduler, disposeBag: disposeBag)
    .to(equal([
        Recorded.next(5, "Hello"),
        Recorded.next(10, "World"),
        Recorded.completed(100)
       ]))

You may also verify specific error types:

expect(imageSubject).events(scheduler: scheduler, disposeBag: disposeBag)
    .to(equal([
        Recorded.error(5, ImageError.invalidImage)
       ]))

Installation

CocoaPods

Add to the tests target in your Podfile:

pod 'RxNimble' # same as RxNimble/RxBlocking

or

pod 'RxNimble/RxTest' # installs RxTest instead of RxBlocking

or even

pod 'RxNimble', subspecs: ['RxBlocking', 'RxTest'] # installs both dependencies

And

pod install
and that's it!

Carthage

Add to your Cartfile.private:

github 'RxSwiftCommunity/RxNimble'

Run

carthage update --cache-builds
then drag & drop from the Carthage/Builds folder into your project either or both of:
  • RxNimbleRxBlocking.framework
    and
    RxBlocking.framework
  • RxNimbleRxTest.framework
    and
    RxTest.framework

Migration 4.5.0 -> 5.0.0

Deprecated function

equalFirst
was removed in favor of a more natural Nimble matcher API style.

RxNimble 4.5.0:

expect(o).to(equalFirst(...))

RxNimble 5.0.0:

expect(o).first.to(equal(...))

Known Issues

Very very very rarely the Swift compiler gets confused about the different types and you need to use the original

RxBlocking
code.

License

MIT ofc.

Give yourself a high five

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.