テストでの依存関係のモック化
実際の実装をテストダブルに置き換えます。
「テストでの依存関係のモック化」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
テストで依存関係をモックする
モックとは、テストで使用する依存関係の偽の実装です。プロトコルを注入しているため、実際の協調オブジェクトの代わりにモックを提供できます。
モック対象のプロトコル
まず、依存関係を表すプロトコルから始めます。実際の型とモックの両方が、このプロトコルに準拠します。
protocol UserStore {
func name(for id: Int) -> String
}
struct RealStore: UserStore {
func name(for id: Int) -> String { "User-\(id)" }
}
print(RealStore().name(for: 5))モックの作成
モックはプロトコルに準拠しながら固定値を返すため、実際のネットワークやディスクにアクセスせずに済みます。
protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore {
func name(for id: Int) -> String { "Mock" }
}
print(MockStore().name(for: 99))モックの注入
テスト対象のシステムに、イニシャライザを通じてモックを渡します。テスト対象のコードは、実際の実装との違いを認識できません。
protocol UserStore { func name(for id: Int) -> String }
struct MockStore: UserStore { func name(for id: Int) -> String { "Mock" } }
struct Profile {
let store: UserStore
func title(_ id: Int) -> String { "Hello, " + store.name(for: id) }
}
print(Profile(store: MockStore()).title(1))呼び出しの記録
モックはどのように使用されたかを記録できるため、依存関係が正しく呼び出されたことをテストで検証できます。
protocol Analytics { func track(_ e: String) }
class SpyAnalytics: Analytics {
var events: [String] = []
func track(_ e: String) { events.append(e) }
}
let spy = SpyAnalytics()
spy.track("open")
spy.track("buy")
print(spy.events)振る舞いの検証
コードを実行した後、記録されたデータを確認します。ここでは、正しいイベントが発生したことを検証します。
protocol Analytics { func track(_ e: String) }
class Spy: Analytics { var last = ""; func track(_ e: String) { last = e } }
struct Checkout { let analytics: Analytics; func pay() { analytics.track("paid") } }
let spy = Spy()
Checkout(analytics: spy).pay()
print(spy.last == "paid")戻り値のスタブ化
スタブはあらかじめ設定した値を返すため、特定の入力に対してコードがどう反応するかをテストできます。
protocol Clock { func hour() -> Int }
struct StubClock: Clock { let value: Int; func hour() -> Int { value } }
struct Greeter { let clock: Clock; func greet() -> String { clock.hour() < 12 ? "AM" : "PM" } }
print(Greeter(clock: StubClock(value: 9)).greet())
print(Greeter(clock: StubClock(value: 18)).greet())失敗のシミュレーション
モックを使うと、実際の依存関係では発生させにくいエラー状況を再現でき、テストカバレッジを高められます。
protocol Loader { func load() -> Int? }
struct FailingLoader: Loader { func load() -> Int? { nil } }
struct VM { let loader: Loader; func status() -> String { loader.load() == nil ? "error" : "ok" } }
print(VM(loader: FailingLoader()).status())決定論的なテスト
モックは固定値を返すため、テストは高速で決定論的になり、実際のサービスによる不安定さもなくなります。
protocol Random { func next() -> Int }
struct FixedRandom: Random { func next() -> Int { 42 } }
struct Game { let rng: Random; func roll() -> Int { rng.next() } }
print(Game(rng: FixedRandom()).roll())ここではテストフレームワークを使わない
実際のプロジェクトでは、これらの確認処理をXCTestのアサーションで記述します。注入のパターンは同じで、異なるのはアサーションの構文だけです。
protocol Calc { func add(_ a: Int, _ b: Int) -> Int }
struct RealCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct MockCalc: Calc { func add(_ a: Int, _ b: Int) -> Int { 0 } }
print(RealCalc().add(2, 2))
print(MockCalc().add(2, 2))一連の流れ
プロトコルを定義し、実際の準拠型とモックの準拠型を作成し、モックを注入し、コードを実行して検証します。DIによって、すべての手順が可能になります。
protocol Repo { func count() -> Int }
struct MockRepo: Repo { func count() -> Int { 3 } }
struct Stats { let repo: Repo; func total() -> Int { repo.count() * 2 } }
print(Stats(repo: MockRepo()).total())確認問題
この方法で依存関係のモックを可能にしているものは何ですか。
まとめ
モックは注入されたプロトコルに準拠し、固定値を返したり、呼び出しを記録したり、失敗をシミュレートしたりします。モックを注入することで、高速で決定論的なテストを実行できます。流れは、プロトコルを定義し、実際の準拠型とモックの準拠型を作成し、注入し、実行し、検証することです。これでDIコースは完了です。
よくある質問
「テストでの依存関係のモック化」レッスンは無料ですか?
はい。「テストでの依存関係のモック化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「テストでの依存関係のモック化」で何を学びますか?
実際の実装をテストダブルに置き換えます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「テストでの依存関係のモック化」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 依存性注入を使う理由
- コンストラクタインジェクション
- プロトコルベースの抽象化
- テストでの依存関係のモック化