Skip to content

Conversation

8rine23
Copy link
Owner

@8rine23 8rine23 commented Jan 13, 2022

概要

以下のServiceに対してのUnitテストを追加します。

  • TaskNoticeService
  • TaskService
  • TaskTypeService
  • TodoNoticeService
  • TodoService
  • TodoTypeService

関係するIssue

(今回はないので、projectsのcardのリンクを載せています)
https://github.com/TowaYamashita/imploop_production/projects/1#card-75775338

@8rine23
Copy link
Owner Author

8rine23 commented Jan 13, 2022

ServiceとRepositoryの扱いについて

現状

  • ServiceとRepositoryに属するメソッドはすべてstaticで参照できるようにしている.
  • 1つのService内で複数のServiceを使うようなときもstaticのメソッド経由で呼び出し合っている.

課題感

  • テストを行う時にstaticメソッドはモックできないため、テストができない
  • 一部のServiceはProvider経由でServiceを提供するように変更しているが、Serviceそのものをテストする際にはRepositoryのモックが必要になる。しかし、RepositoruもProvider経由でアクセスさせようとしてもServiceはWidgetではないため参照できない

目標

  • ServiceとRepositoryをテスタブルな構成に変更する
    • テスタブル=モックができる

具体的な手法

// Provider経由でServiceを使用
// テストを行う際にはoverrideValueでProviderの中身を書き換える
final sampleServiceProvider = StateProvider((ref) => SampleService(ref.read, SampleRepository(),),);

// Serviceクラス
class SampleService{
  // 他のServiceへはこのreadを使ってアクセスする
  final Reader read;
  // RepositoryのインスタンスをService内に持っておいてDBへのアクセスはこのクラスから操作を行う
  final SampleRepository repository;
  
  SampleService(this.read, this.repository);
}

// Repositoryクラス
// このクラス経由でDBにアクセスする
class SampleRepository{
}

検討した手法

各ServiceのProviderでインスタンスを生成する際にDI

  • ServiceがServiceを使うような処理をやった際に、相手側のServiceのインスタンスが作成できない

手動DIでインスタンスだけ先に作り、各ServiceのProviderでインスタンスを生成する際にDIコンテナから取得する

  • ServiceがServiceを使うような処理をやった際に、相手側のServiceのインスタンスが作成できない

手動DIでインスタンスだけ先に作り、各ServiceのプロパティとしてDIコンテナを持つようにする

  • Diで作るインスタンスの中にDiを打ち込むって無理では?
  • すべてのServiceから使えるようになってしまうため、コードの秩序が壊れる

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant