Clean Architectureで実装したAPIにJestテストを導入する

Clean Architectureで実装したAPIにJestテストを導入する

2022年1月1日
アーキテクチャ

こちらの記事は前回の続きです。

【Typescript】Clean Architecture + DDDでAPIを実装してみた

Typescript + ​​Clean Architecture + DDDで…
mintaku-blog.net

Jestを導入する

本来ならTDD的にテストを書いてから実装するのですが、元々の目的がClean Architecture + DDDのAPIをつくるのが目的だったため、後からテストを導入することになりました。

APIはTypescriptで実装されているため、Jestを導入しました。また前回同様、本記事ではメンバー関連を中心に取り扱います。APIしか作ってないのでE2EはなくUnitテストのみです。

 

型のモックの実現

テストにおいて型のモックは型を抽象化するジェネリックを使って実現します。特に実値で書く必要のない値に関してはモックを使用しています。

 

Domainのテスト

ドメインのテストを書いていきます。

バリデーションやドメインへの変換処理などをテストしていきます。誕生日から年齢を取得するドメインメソッドのテストは現在日から取得しているため1年経つとテストが落ちるようになってしまうのが悩みどころです。上手い具合にテストできればいいのですが。。

・Member.spec.ts

 

UseCaseのテスト

次にUseCaseのテストを書いていきます。

MemberPortをモックし、メソッドが呼び出されたら返却されるレスポンスを定義して返してあげるようにします。レスポンスデータはモックできるものはモックし、登録系などバリデーションするものは実値で書いてます。

・MemberUseCase.spec.ts

 

Gateway・Controllerのテスト

Gateway・Controllerのテストを書いていきます。これらのレイヤら主に変換処理を行うためテストが長くなりがちです。

やっていることはシンプルでGatewayだったらUseCaseから受け取ったドメインをDriver用にプリミティブなオブジェクトに変換して渡してあげ、Driverから受け取ったレスポンスデータをドメインに詰め直す処理をしています。テストとしてはそれらがちゃんと期待しているデータに変換され期待しているメソッドが呼び出されているかをアサートしています。

privateなメソッドに関してはtarget[“hoge”](fuga)のようにアクセスしてテストを行っています。

・MemberGateway.spec.ts

 

・MemberController.spec.ts

 

 

テスト実行

最後にテスト実行していきます。テストが通ると以下のようにpassedにカウントされます。