※弊社エンジニアの記事になります。
はじめに
こんにちは!
今年の10月にライトコードに入社したあらいと申します。
皆さん、DIについてしっかり理解していますでしょうか。
私個人的なDIの使用経験としては、過去にJava(Spring Boot)を使用していた現場でのものです。そこでは、お作法のようにDIをコンストラクタに記述したり、テスト時にモックを用いたりしていたため、DIの深いメリットや、それを使用しないことのデメリットを深く考えることなく利用していました。また、DIではないコードによる具体的な困難を経験したことがなかったため、DIに対する理解は曖昧なものでした。
ライトコードに入社してからは、初めてLaravelを用いた開発に携わる機会があり、特にテストが不十分な機能のテストコードの実装に取り組む機会がありました。
その際に「あれ、これテスト書きにくいな...」と思った事があり、そこでDIを使ってみたところ、テストが格段にやりやすくなることに気づきました。
この経験を通じて、DIのメリットが少しずつ見えてきました。
本記事では、DIのメリットを実感するまでの過程や、その経験についてお話ししていきたいと思います。
DIとは?
今回の対応にあたり、DI(依存性注入)の理解を深めるために勉強しました。そこで得た知識を、簡単に解説できればと思います。
DIを一言で表すなら「疎結合を目的としたデザインパターン」のことです。
疎結合とは、コードの各部分が互いに独立していて、他の部分への依存が少ない状態を指します。DIでは、オブジェクトの依存関係をコードの外部から供給することで、この疎結合を実現しています。
「依存性の注入」という用語は、一見抽象的で理解しにくいかもしれませんが、実際には「依存しているオブジェクトを外部から供給する」と考えていただければ少しわかりやすいかと思います。
DIの概要について触れたところで、次に今回対応を行うことになった機能の現状のサンプルコードを見ていきます。
現状のコード
具体的な業務コードを示すことはできませんが、代わりにGoogle Cloud Storage(GCS)へのアップロード処理を例に挙げます。この処理では、データベースからデータを取得し、それを加工した後にGCSにアップロードするといったものです。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Google\Cloud\Storage\StorageClient;
class XxxxFileCommand extends Command
{
protected $signature = 'file:xxxx';
protected $description = 'Process and upload a file to Google Cloud Storage';
public function __construct()
{
parent::__construct();
}
public function handle()
{
// GCSのStorageClientをインスタンス化
$storageClient = new StorageClient();
// バケットを取得
$bucket = $storageClient->bucket('your-bucket-name');
// DBからデータを取得する処理
// 省略...
// アップロード対象のファイルの加工処理
$processedFile = 'processedFile' // 仮
// ファイルをGCSにアップロード
$bucket->upload(
fopen($processedFile, 'r'),
[
'name' => 'output_file_name'
]
);
$this->info('File has been processed and uploaded to Google Cloud Storage.');
}
}このコードのままテストを実装しようとしたときの課題
テストコードの実装にあたり、私は特に一つの大きな問題に直面しました。それは、テスト実行時にGoogle Cloud Storage(GCS)への実際のアップロードを防ぎたいということです。
現在のコードでは、テストを実行する度に、StorageClientがインスタンス化され、ファイルがGCSにアップロードされるリスクがあります。これは、環境変数を使ってアップロードを制御しているものの、誤った設定やその他のエラーにより、テストが失敗する可能性があります。
さらに、アップロードするファイルの内容を確認するテストをどのように書けば良いかという課題もありました。
テストで重要なのは、ファイルが正しく加工され、適切な内容でアップロードされているかを確認することです。しかし、現状のコードでは、アップロード処理が密結合しており、これを分離してテストしやすくする方法を模索する必要がありました。
このような問題点を踏まえ、テストコードを書きやすくするためのリファクタリングが必要となりました。次のセクションでは、どのようにコードを修正し、テストの容易性を高めたかについて詳しく説明します。
…
記事の続きは下のリンクをクリック!
https://rightcode.co.jp/blog/information-technology/laravel-testcode-di-syain
【2025年卒】新卒採用エントリー開始しました!
特設ページはこちら:https://rightcode.co.jp/recruit/career-fair-2025
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
【コーポレートサイト】https://rightcode.co.jp/
【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)
【wantedlyぺージ】https://www.wantedly.com/companies/rightcode