こんにちは。よっしーです(^^)
今日は、clock-mockをインストールして、動作確認する方法についてご紹介します。
背景
Dockerで構築したPHPの開発環境において、clock-mockのインストールと動作確認について調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
作成ファイル一覧
下記のファイルを作成します。ファイル内容は下記のセクションに記載しています。
new file: compose.yml
new file: php/Dockerfile
new file: php/src/Sample.php
new file: php/src/composer.json
compose.yml
version: '3.8'
services:
php-cmd:
build: ./php
container_name: php-cmd
volumes:
- ./php/src:/work
php/Dockerfile
FROM php:8.2-cli
RUN apt-get update \
&& apt-get install -y \
unzip
RUN pecl install uopz \
&& docker-php-ext-enable uopz
WORKDIR /work
COPY --from=composer /usr/bin/composer /usr/bin/composer
php/src/Sample.php
<?php
require 'vendor/autoload.php';
use SlopeIt\ClockMock\ClockMock;
ClockMock::freeze(new \DateTime('1986-06-05'));
// Code executed in here, until ::reset is called, will use the above date and time as "current"
$nowYmd = date('Y-m-d');
ClockMock::reset();
echo $nowYmd . PHP_EOL;
echo date('Y-m-d') . PHP_EOL;
php/src/composer.json
{
"require-dev": {
"slope-it/clock-mock": "^0.4.0"
}
}
動作確認
下記のコマンドを実行します。
# ビルド
docker compose build
# 依存しているソフトのインストール
docker compose run -it --rm php-cmd composer install
# 動作確認
docker compose run -it --rm php-cmd php Sample.php
下記のような出力になれば成功です。
% docker compose run -it --rm php-cmd php Sample.php
1986-06-05
2023-10-09
解説
php/Dockerfile
このDockerfileは、Dockerコンテナ内でPHP 8.2 CLI環境を構築するためのものです。以下は、各行のコードの解説です。
FROM php:8.2-cli
- この行は、ベースイメージとして公式のPHP 8.2 CLIイメージを使用することを指定しています。Dockerコンテナのベースイメージとして使用するイメージを選択します。
RUN apt-get update \
- この行は、コンテナ内のパッケージリストを更新します。
apt-get
はDebian系Linuxディストリビューションでパッケージを管理するためのツールで、ここではパッケージリストを最新の情報に更新しています。
- この行は、コンテナ内のパッケージリストを更新します。
&& apt-get install -y unzip
- この行は、
unzip
というパッケージをコンテナ内にインストールします。-y
オプションは、インストールプロセス中に確認プロンプトが表示されないようにするためのものです。
- この行は、
RUN pecl install uopz \
- この行は、PECL(PHP Extension Community Library)を使用してPHP拡張モジュールである
uopz
をインストールします。uopz
はPHPのオペレーションズ拡張モジュールで、実行時のオペレーションを操作するために使用されます。
- この行は、PECL(PHP Extension Community Library)を使用してPHP拡張モジュールである
&& docker-php-ext-enable uopz
- この行は、
uopz
拡張モジュールを有効にします。PHPの拡張モジュールを有効にするためにdocker-php-ext-enable
コマンドが使用されています。
- この行は、
WORKDIR /work
- この行は、コンテナ内の作業ディレクトリを
/work
に設定します。以降の命令はこのディレクトリ内で実行されます。
- この行は、コンテナ内の作業ディレクトリを
COPY --from=composer /usr/bin/composer /usr/bin/composer
- この行は、別のDockerイメージからファイルをコピーします。
--from=composer
は、composer
という名前の別のイメージからファイルをコピーすることを指定しています。具体的には、/usr/bin/composer
というファイルをコンテナ内の/usr/bin/composer
にコピーしています。これにより、コンテナ内でComposerを実行できるようになります。
- この行は、別のDockerイメージからファイルをコピーします。
このDockerfileは、PHP 8.2 CLI環境を構築し、uopz
拡張モジュールを有効にし、Composerをコンテナ内で実行できるようにします。また、unzip
パッケージもインストールされています。このコンテナは、PHPプロジェクトのビルドや実行に使用できるでしょう。
php/src/Sample.php
このPHPコードは、SlopeIt\ClockMockというライブラリを使用して、時刻をモック化する方法を示しています。このコードを実行すると、一時的に指定した日時を”現在の”日時として使用し、その後にリセットすることができます。以下はコードの詳細な解説です。
require 'vendor/autoload.php';
- Composerを使用して依存関係を管理している場合、
vendor/autoload.php
を通じてComposerのオートロードファイルを読み込んでいます。これにより、後続のクラスや関数の自動読み込みが可能になります。
- Composerを使用して依存関係を管理している場合、
use SlopeIt\ClockMock\ClockMock;
- SlopeIt\ClockMockライブラリから
ClockMock
クラスをインポートしています。このクラスは、時刻をモック化するために使用されます。
- SlopeIt\ClockMockライブラリから
ClockMock::freeze(new \DateTime('1986-06-05'));
ClockMock::freeze()
メソッドを使用して、指定した日時(1986年6月5日)を”現在の”日時として凍結します。これにより、以降のコードでこの日時が現在の日時として使用されます。
$nowYmd = date('Y-m-d');
- この行では、
date()
関数を使用して、現在の日付(指定された日付に凍結されている)を$nowYmd
変数に格納します。
- この行では、
ClockMock::reset();
ClockMock::reset()
メソッドを呼び出して、時刻の凍結をリセットします。これにより、以降のコードで通常の現在の日時が再び使用されます。
echo $nowYmd . PHP_EOL;
$nowYmd
変数に格納された日付を表示します。この行は、凍結された日時を表示します。
echo date('Y-m-d') . PHP_EOL;
date()
関数を使用して、通常の現在の日付を表示します。この行は、時刻が凍結されていない通常の日付を表示します。
したがって、このコードを実行すると、$nowYmd
変数には凍結された日時(1986年6月5日)が含まれ、その後のdate()
関数は通常の日付を表示します。ClockMock::reset()
を呼び出すことで、時刻の凍結が解除され、通常の日付が再び使用されるようになります。
おわりに
今日は、clock-mockをインストールして、動作確認する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント