Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unity用MockClientの話
Search
いも
June 19, 2018
Technology
0
1.5k
Unity用MockClientの話
弁当付き社内LT「Jikai Lightning Talks #1」で発表したやつを公開用にちょっと修正したやつです
いも
June 19, 2018
Tweet
Share
More Decks by いも
See All by いも
UnityプログラミングバイブルR6号宣伝&Unity Logging小話
adarapata
0
500
Unityテスト活動のふりかえり
adarapata
1
560
Gather.townはいいぞ その後
adarapata
1
1.6k
Unityでの開発事例
adarapata
3
22k
どこのご家庭にもあるシーンマネージャーの話
adarapata
1
7.9k
Gather.townはいいぞ
adarapata
2
2.4k
宴はいいぞ
adarapata
0
1.4k
わかった気になるモブプログラミング
adarapata
1
110
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.2k
Other Decks in Technology
See All in Technology
組織とセキュリティ文化と、自分の一歩
maimyyym
3
1.3k
libsyncrpcってなに?
uhyo
0
230
データベースの引越しを Ora2Pg でスマートにやろう
jri_narita
0
160
うちの会社の評判は?SNSの投稿分析にAIを使ってみた
doumae
0
570
DevOpsDays Taipei 2025 - Opening Remarks
cheng_wei_chen
0
120
Digitization部 紹介資料
sansan33
PRO
1
3.9k
キャッシュレス決済のプロダクトから決済基盤への進化
b1a9id
0
160
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
25k
20250514_未経験から Fintech実務参画まで。学生エンジニアの挑戦録
hideto1008
0
810
DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!
martin_lover
0
200
CSSDay, Amsterdam
brucel
0
250
医療業界に特化した音声認識モデル構築のためのアノテーションの実態
thickstem
0
180
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
Designing Experiences People Love
moore
142
24k
Documentation Writing (for coders)
carmenintech
71
4.8k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
180
53k
Bash Introduction
62gerente
614
210k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Typedesign – Prime Four
hannesfritz
42
2.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Visualization
eitanlees
146
16k
Transcript
Unity 用MockClient のお話 2018/06/19 Jikai Lightning Talks #1
imo です
最近やったこと テスト導入したりしていました。 https://speakerdeck.com/adarapata/unitypurodakut onitesutowodao-ru-siteikumade?slide=1
最近困っていたこと ユニットテストは導入できたが書けないパター ン がある 通信とか挟まるとダメ 通信の結果ごにょごにょとかよくある 通信テスト自体はエディタ拡張している つらい
どう解決するか? ユニットテスト時のみモックしてくれる仕組みが 欲しい Unity にそういう機能はないっぽい 通信をモックするクライアントを実装しよう
API Client の流れ APIClient にRequestBase を投げると通信してくれる var client = new
ApiClient(); client.StartRequest(new FooRequest()); // => Result<FooResponse>
抽象化してみる IHTTPClient を差し替えれればスマー トっぽい でも結構根っこから変えるのは大変そう IApiClient <=> IRequest 間をごまかそう
どうモックするか Moq を利用する https://github.com/moq/moq4 C# 用のモックライブラリ Zenject にOption として付属している .NET
3.5 用と4.6 用どちらも用意してて便利
できあがり テスト用に ApiClientMock クラスを作成。 Mock メソッドでモックできる var mock = new
ApiClientMock(); var mockResponse = new TResponse(); mock.Mock<TRequest, TResponse>().Success(mockResponse); mock.StartRequest(new TRequest()); // => Result<TResponse>
通信が成功したことにする var mock = new ApiClientMock(); var response = new
FooResponse(); mock.Mock<FooRequest, FooResponse>().Success(response); var result = mock.StartRequest(new FooRequest()); result.Response.Content; // => FooResponse
サー バからエラー が返ってきたことにする var mock = new ApiClientMock(); ErrorResponse error
= new ErrorResponse(); mock.Mock<FooRequest, FooResponse>().Failure(error); var result = mock.StartRequest(new FooRequest()); result.Response.ErrorResponse; // => ErrorResponse
通信エラー が発生したことにする var mock = new ApiClientMock(); mock.Mock<FooRequest, FooResponse>().Error(Error.Network); var
result = mock.StartRequest(new FooRequest()); result.ErrorCause; // => Error.Network
バリデー ション モックしてない部分の通信が走ると落ちる => FooRequest はモックされていません。 ex. client.Mock<FooRequest, FooResponse>().Success(res); モックしたレスポンスが適切でなかったら落ちる
=> レスポンスが間違ってます Expected: <FooReponse> But was: <BarResponse> モックしたけど呼ばれなかったら落ちる => FooRequest をモックしましたが呼ばれていません!
用途 通信の結果で処理が変わるFooUseCase を想定 public class FooUseCase { private IApiClient client;
public FooUseCase(IApiClient client) { this.client = client; } public string Run() { var result = client.StartRequest(new FooRequset()); if(result.IsSuccess) { return result.Response.Content.Foo; } else { return "NG"; } } }
テストコー ド public class FooUseCaseTest { private IApiClient client; [Test]
public void Run_Success() { client = new ApiClientMock(); var response = new FooResponse { Foo = "OK" }; client.Mock<FooRequest, FooReponse>() .Success(response); var useCase = new FooUseCase(client); Assert.AreEqual("OK", useCase.Run()); } } ApiClientMock を外から流し込めば意図した挙動にな る
Moq 便利 通信部分を気にせずテストが書ける 「 これテスト書けますよ!」 というアプロー チが しやすくなった モックのやり過ぎに注意 テストしないといけない部分をモックしては本末
転倒 何故モックするのかを考える 通信そのものは別でテストしましょう