6. 並列
Quick + Nimble + SwiftyMockyを組み合わせた形(1)
RxBlockingを利用しつつもUnitTestの骨格部分はQuick + Nimbleの組み合わせ
テストケースの基本形 全体処理を考える
describe("#execute") {
context(“A/Bの対象&トレンドキーワードの一覧が取得処理が成功した場合”) {
let checkTrendKeywordEnabled = true
let trendkeywords = … (Stubに相当するテストデータの作成) …
beforeEach {
checkTrendKeywordEnabledUseCase.given(
.execute(willReturn: Single.just(checkTrendKeywordEnabled))
)
getTrendKeywordUseCase.given(
.execute(willReturn: Single.just(trendkeywords))
)
}
it(“トレンドキーワードのデータ一覧が取得できること”) {
expect(try! target.fetch().toBlocking().first())
.to(equal(trendkeywords))
}
}
}
① Quick & Nimbleの記載方法
② Stubを定義してMockに適用する
- ① Business Logic → return Single<P>
- ② Another Business Logic → return Single<Q>
- ③ Common Business Logic → return Single<R>
Expected Result → return S
とある処理でこの3つの処理が必要になる場合:
(Point) 実際のコードで結果を得るための処理は?
③ 期待するケースをRxBlockingを利用して記載
① Single<P>
② Single<Q>
③ Single<R>
① Single<P>
→ ② Single<Q>
→ ③ Single<R>
直列
※ 処理の順番が実は大きな影響を及ぼす場合もあったりする
7. Quick + Nimble + SwiftyMockyを組み合わせた形(2)
SwiftyMockyを利用して該当する責務部分をUnitTestで利用するためにMock化
SwiftyMockyの導入と紹介 // Install SwiftyMocky CLI
$ brew install mint
$ mint install MakeAWishFoundation/SwiftyMocky
👉 Swift Package Manager
👉 Test Target
// MEMO: Mock preparation required for testing
let checkTrendKeywordEnabledUseCase = CheckTrendKeywordEnabledUseCaseMock()
let getTrendKeywordUseCase = GetTrendKeywordUseCaseMock()
// MEMO: Apply Mock to the class under test
let target = TrendKeywordPresenterImpl(
checkTrendKeywordEnabledUseCase: checkTrendKeywordEnabledUseCase,
getTrendKeywordUseCase: getTrendKeywordUseCase
)
// sourcery: AutoMockable
protocol CheckTrendKeywordEnabledUseCase {
func execute() -> Single<Bool>
}
// sourcery: AutoMockable
protocol GetTrendKeywordUseCase {
func execute() -> Single<[TrendKeyword]>
}
// Generate Mock
$ swiftymocky generate
UnitTestを実施する準備
SwiftyMocky:
https://github.com/MakeAWishFoundation/SwiftyMocky
Mockを適用して想定する値を返す形を作っていく