後でカスタムサーバーの応答を渡します。URLRequeststopLoading()startLoading()MockURLProtocolを指定したURLSessionを作成するMockURLProtocolを使うためにURLProtocolを指定する必要があるので実装を追加していきます。}}URLSessionConfiguration.ephemeralはキャッシュ、Cookie、またはクレデンシャルに永続ストレージを使用しないセッション構成となります。これで、URLsessionにMockURLProtocolを指定してMockURLProtocolを使用する準備が出来ました。requestHandlerを使ったデータ注入MockURLProtocolに定義したrequestHandlerを使ってMockURLProtocolにダミーデータを送る準備をしていきます。MockURLProtocolにデータを注入できることをprotocolを使って表現します。ここが自分が分かっていなかった3のデータの注入の部分です。Data?)}URLSession型のurlSessionというオブジェクトとinjectingToMockURLProtocol(data:)という関数を持つprotocolを定義しました。続いてinjectingMockURLProtocolをextensionを使って標準実装します。}}injectingToMockURLProtocol(data:)は外からデータを受け取ってMockURLProtocol.requestHandlerにデータを渡す仕事を目的とします。これでDataInjectableの実装が終わったので、MockAPIServiceをDataInjectableに準拠させます。}}標準実装しているのでただ準拠させているだけです。ApiServiceにも準拠させます。Request)の返り値がないので中身を実装していきます。いっても中編で定義した処理内容とほとんどかわりません。.eraseToAnyPublisher()これでURLProtocolにデータを注入したテストがかけるようになりました。テストの全体的な流れはこのようになります。}}HTTPリクエストのテストはこれでうまく行きそうです。ViewModelのテストViewModelのテストも先程実装したMockAPIServiceでいけるかなと自問自答したときに、ViewModelの関心はAPIの処理が適切にハンドリングされていることではないはずで、URLProtocolを使ってモックするやりかたではないなと思いました。そのため、MockAPIServiceとは別のサービスクラスを用意しました。先程のサービスクラスはDataInjectableMockAPIServiceに改名しました。Injection)ViewModelの外から渡された値を元にプロパティを変更できる(ViewModelのInput)ViewModelの外から監視しているプロパティが内部ロジックを経て購読できる(ViewModelのOutput)以上を踏まえた上で今回のケースではAppleIDとの連携について考えたいと思います。このようなアカウントの連携画面があって、AppleIDがすでに連携済みである場合、ViewModel内のisAppleLoggedInResultというプロパティがtrueになっていることをテストしていきます。シナリオはこのような感じですViewModelを初期化するタイミングでisAppleLoggedInResultはtrueになっているこれをテストしていきます。通信の結果を置き換える前述の通りViewModelのテストはAPIの通信結果のハンドリングには関心を持たせたくないので通信結果を準備したデータに置き換えていきます。実際に通信するわけではなく通信結果の代わりにMockAPIServiceに置き換えたデータを渡してそれを返してあげれば良さそうです。APIRequestTypeを定義してArrayに追加できるようにします。APIServiceError>なAnyPublisherが追加される想定です。Request)を実装しなければいけないので追加します。APIServiceError>で返ってくるようにcall(request:)の中身を実装していきます。最終的には下記のようになりました。Arrayに登録されている最後のデータを返す。空のPublisherを返す}MockAPIServiceを利用する最終的にテストケースはこのようになりました。UserLinkedAccountsResponseの値に置き換えられていることが分かります。これでViewModelのテストもうまくかけそうです。最後に今回はAPIのテストとViewModelのテストを書く部分についてお伝えしました。Combine使ってみたいけどテストどうやって書くのかな?とかAPIのテストの書き方など少しでもお役に立てたら幸いです。URLProtocolのモックやAPIクライアント自作によるURLRequestの生成などで普段エンドポイント作成しているだけでは分からないことが少し分かった気になりました。余談ですが、初実装ではbodyパラメータの実装がまんま抜けてて、後で気づいて冷や汗を書きました。私までご連絡ください!お待ちしております。フロントエンドテストをコツコツ積み上げて...こんにちは。コネヒト歴7ヶ月目のWebエンジニアの古市です。バージョンアップしました。(2)書いたメンバーid:taxa_programid:katsutomu0124id:sasashuuuid:NahomiTakahashiid:toc8id:yoshitaka465id:yanamuraid:ryoutakaya3623id:azuki_mihomihoid:takflifeid:nagaisid:aboy_perryid:laugh_kid:connehito-mkashiwagiid:tommy_kwid:itosho525id:su-kun1899id:ohayoukenchanid:satoshieid:plane25id:connehitoid:fortkleお問い合わせコネヒト株式会社Wantedly引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。