Type | RxJava | ReactiveSwift | Combine |
---|---|---|---|
properties | Observable<T>, where Observable is often backed by a BehaviorSubject | Property<T>, where it wraps a MutableProperty | CurrentValueSubject or @Published |
retrieving values | Single<T> | SignalProducer<T> | Publisher<T, Error>, or Deferred + Future |
modifying state | Completable | SignalProducer<Void, Error> | Publisher<T, Error> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@DisplayName("Given we are testing blockingFirst") | |
class BlockingFirstTest : KoinTest() { | |
private val behaviorSubject: BehaviorSubject<Int> = BehaviorSubject.createDefault(0) | |
private val observableSubject: Observable<Int> = behaviorSubject | |
@Test | |
fun `then it should have emitted six times`() { | |
var didEmit = 0 | |
observableSubject.doOnNext { didEmit += 1 }.blockingMostRecent(null).iterator().next() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 🍎 | |
// in viewDidLoad | |
viewModel.events.take(duringLifetimeOf: self).observeValues { [weak self] (event) in | |
guard let self = self else { return } | |
switch event { | |
case .mutualMatch: //... | |
case .premiumRequired: //... | |
case .exitMatch: //... | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 🍎 | |
// In our viewDidLoad | |
viewModel.state.producer.take(duringLifetimeOf: self).startWithValues { [weak self] (state) in | |
guard let self = self else { return } | |
switch state { | |
case .initial: //... | |
case .error: //... | |
case .loading: //... | |
case .started: //... | |
case .finished: //... |
Platform | Interface | Implementation | Example |
---|---|---|---|
iOS | <feature>ApiImplementing | <feature>Api | MatchApiImplementing / MatchApi |
Android | I<feature>Api | <feature>Api | IMatchApi / MatchApi |
Platform | GET | POST/DELETE |
---|---|---|
iOS | SignalProducer<T, TError> or AnyPublisher<T, TError> | SignalProducer<Void, Error> or AnyPublisher<Void, TError> |
Android | Single | Completable |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static func mapError(apiError: Error) -> PSSFreeTrialError { | |
if let apiError = apiError as? PSSApiError { | |
switch apiError.statusCode { | |
case Int(HTTP_RESPONSE_BAD_REQUEST): | |
return PSSFreeTrialError.cannotBeActivated |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Nested | |
@DisplayName("given I flag someone") | |
inner class FlagSomeone { | |
lateinit var testObserver: TestObserver<MatchEvent> | |
lateinit var targetProfile: Profile | |
@BeforeEach | |
fun setup() { | |
testObserver = matchViewModel.events.test() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
context("given I flag someone") { | |
var testObs: TestObserver<PSSMatchViewModel.Event, Never>! | |
var targetProfile: PSSProfile! | |
beforeEach { | |
testObs = TestObserver<PSSMatchViewModel.Event, Never>() | |
viewModel.events.signal.observe(testObs.observer) | |
for _ in 0..<instructionCardsNum { | |
viewModel.swipe(rating: PSSMatchRating.interested) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class InstantExecutorExtension : BeforeEachCallback, AfterEachCallback { | |
override fun beforeEach(context: ExtensionContext?) { | |
ArchTaskExecutor.getInstance() | |
.setDelegate(object : TaskExecutor() { | |
override fun executeOnDiskIO(runnable: Runnable) = runnable.run() | |
override fun postToMainThread(runnable: Runnable) = runnable.run() | |
override fun isMainThread(): Boolean = true | |
}) |
NewerOlder