Slide 10
Slide 10 text
簡単なViewModel処理例とQuick/NimbleでのUnitTest(2)
シンプルな処理をする様なViewModelの事例とUnitTestを考えてみます
Quick/Nimbleを利用したUnitTest例:
describe("#fetchNewsItems") {
// 期待する初期値 & 実行後に期待する値を定義する
let emptyItems: [NewsItem] = []
let expectedNextItems: [NewsItem] = [
NewsItem(id: 1, title: "夏祭り2023開催のお知らせ", category: "イベント"),
NewsItem(id: 2, title: "美味しい餃子の販売開始", category: "新商品"),
NewsItem(id: 3, title: "美味しいプリンの販売開始", category: "新商品")
]
// 👉 NewsViewModelをインスタンス化する際に、想定するAPIリクエストのMockを適用
// ※補足: func getNewsItems() -> AnyPublisher<[NewsItem], Never> を想定
let sut = NewsViewModel(api: APIRequestManagerMock())
// CombineExpectationを利用してViewModel内の変数:newsItemの変化を記録する想定
// 👉 変数:newsItemで`@Published`を利用するのでこの値変化を記録対象とする
var newsItemsRecorder: Recorder<[NewsItem], Never>!
// context 〜 it の流れで検証したいケースを作成する
}
context("API通信処理が成功した場合") {
// 👉 UnitTest実行前後で実行する処理
beforeEach {
newsItemsRecorder = sut.$newsItem.record()
}
afterEach {
newsItemsRecorder = nil
}
// 値変化を記録対象とする変数が、期待した変化をすること確認する
it("初期値:emptyItemsの内容 → 実行後:expectedNextItems となること") {
// 👉 ViewModel内処理を実行
sut.fetchNewsItems()
// 0.16秒間の変化を見て、期待した値変化となることを確認する
let newsItemsRecorderResult = try! self.current
.wait(for: newsItemsRecorder.availableElements, timeout: 0.16)
expect(newsItemsRecorderResult)
.to(equal([emptyItems, expectedNextItems]))
}
}
final class NewsViewModelTest: QuickSpec