Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity用MockClientの話

いも
June 19, 2018

 Unity用MockClientの話

弁当付き社内LT「Jikai Lightning Talks #1」で発表したやつを公開用にちょっと修正したやつです

いも

June 19, 2018
Tweet

More Decks by いも

Other Decks in Technology

Transcript

  1. API Client の流れ APIClient にRequestBase を投げると通信してくれる var client = new

    ApiClient(); client.StartRequest(new FooRequest()); // => Result<FooResponse>
  2. できあがり テスト用に ApiClientMock クラスを作成。 Mock メソッドでモックできる var mock = new

    ApiClientMock(); var mockResponse = new TResponse(); mock.Mock<TRequest, TResponse>().Success(mockResponse); mock.StartRequest(new TRequest()); // => Result<TResponse>
  3. 通信が成功したことにする var mock = new ApiClientMock(); var response = new

    FooResponse(); mock.Mock<FooRequest, FooResponse>().Success(response); var result = mock.StartRequest(new FooRequest()); result.Response.Content; // => FooResponse
  4. サー バからエラー が返ってきたことにする var mock = new ApiClientMock(); ErrorResponse error

    = new ErrorResponse(); mock.Mock<FooRequest, FooResponse>().Failure(error); var result = mock.StartRequest(new FooRequest()); result.Response.ErrorResponse; // => ErrorResponse
  5. バリデー ション モックしてない部分の通信が走ると落ちる => FooRequest はモックされていません。 ex. client.Mock<FooRequest, FooResponse>().Success(res); モックしたレスポンスが適切でなかったら落ちる

    => レスポンスが間違ってます Expected: <FooReponse> But was: <BarResponse> モックしたけど呼ばれなかったら落ちる => FooRequest をモックしましたが呼ばれていません!
  6. 用途 通信の結果で処理が変わる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"; } } }
  7. テストコー ド 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 を外から流し込めば意図した挙動にな る