PHP入門:clock-mockのインストールと動作確認

スポンサーリンク
PHP入門:clock-mockのインストールと動作確認 ノウハウ
PHP入門:clock-mockのインストールと動作確認
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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環境を構築するためのものです。以下は、各行のコードの解説です。

  1. FROM php:8.2-cli
    • この行は、ベースイメージとして公式のPHP 8.2 CLIイメージを使用することを指定しています。Dockerコンテナのベースイメージとして使用するイメージを選択します。
  2. RUN apt-get update \
    • この行は、コンテナ内のパッケージリストを更新します。apt-getはDebian系Linuxディストリビューションでパッケージを管理するためのツールで、ここではパッケージリストを最新の情報に更新しています。
  3. && apt-get install -y unzip
    • この行は、unzipというパッケージをコンテナ内にインストールします。-yオプションは、インストールプロセス中に確認プロンプトが表示されないようにするためのものです。
  4. RUN pecl install uopz \
    • この行は、PECL(PHP Extension Community Library)を使用してPHP拡張モジュールであるuopzをインストールします。uopzはPHPのオペレーションズ拡張モジュールで、実行時のオペレーションを操作するために使用されます。
  5. && docker-php-ext-enable uopz
    • この行は、uopz拡張モジュールを有効にします。PHPの拡張モジュールを有効にするためにdocker-php-ext-enableコマンドが使用されています。
  6. WORKDIR /work
    • この行は、コンテナ内の作業ディレクトリを/workに設定します。以降の命令はこのディレクトリ内で実行されます。
  7. COPY --from=composer /usr/bin/composer /usr/bin/composer
    • この行は、別のDockerイメージからファイルをコピーします。--from=composerは、composerという名前の別のイメージからファイルをコピーすることを指定しています。具体的には、/usr/bin/composerというファイルをコンテナ内の/usr/bin/composerにコピーしています。これにより、コンテナ内でComposerを実行できるようになります。

このDockerfileは、PHP 8.2 CLI環境を構築し、uopz拡張モジュールを有効にし、Composerをコンテナ内で実行できるようにします。また、unzipパッケージもインストールされています。このコンテナは、PHPプロジェクトのビルドや実行に使用できるでしょう。

php/src/Sample.php

このPHPコードは、SlopeIt\ClockMockというライブラリを使用して、時刻をモック化する方法を示しています。このコードを実行すると、一時的に指定した日時を”現在の”日時として使用し、その後にリセットすることができます。以下はコードの詳細な解説です。

  1. require 'vendor/autoload.php';
    • Composerを使用して依存関係を管理している場合、vendor/autoload.phpを通じてComposerのオートロードファイルを読み込んでいます。これにより、後続のクラスや関数の自動読み込みが可能になります。
  2. use SlopeIt\ClockMock\ClockMock;
    • SlopeIt\ClockMockライブラリからClockMockクラスをインポートしています。このクラスは、時刻をモック化するために使用されます。
  3. ClockMock::freeze(new \DateTime('1986-06-05'));
    • ClockMock::freeze()メソッドを使用して、指定した日時(1986年6月5日)を”現在の”日時として凍結します。これにより、以降のコードでこの日時が現在の日時として使用されます。
  4. $nowYmd = date('Y-m-d');
    • この行では、date()関数を使用して、現在の日付(指定された日付に凍結されている)を$nowYmd変数に格納します。
  5. ClockMock::reset();
    • ClockMock::reset()メソッドを呼び出して、時刻の凍結をリセットします。これにより、以降のコードで通常の現在の日時が再び使用されます。
  6. echo $nowYmd . PHP_EOL;
    • $nowYmd変数に格納された日付を表示します。この行は、凍結された日時を表示します。
  7. echo date('Y-m-d') . PHP_EOL;
    • date()関数を使用して、通常の現在の日付を表示します。この行は、時刻が凍結されていない通常の日付を表示します。

したがって、このコードを実行すると、$nowYmd変数には凍結された日時(1986年6月5日)が含まれ、その後のdate()関数は通常の日付を表示します。ClockMock::reset()を呼び出すことで、時刻の凍結が解除され、通常の日付が再び使用されるようになります。

おわりに

今日は、clock-mockをインストールして、動作確認する方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました