1. ホーム
  2. php

PHPUnit で時間を "モック" することはできますか?

2023-10-28 10:08:19

質問

... 'mock' が正しい言葉なのかどうかわからない。

とにかく、私は時間ベースのいくつかのテストを書こうとしている継承されたコードベースを持っています。このような 曖昧にならないように、コードはアイテムの履歴を見て、そのアイテムが時間のしきい値に基づいたかどうかを判断することに関連しています。

ある時点で、私はまた、その履歴に何かを追加し、閾値が今変更された(そして、明らかに、正しい)ことをチェックすることをテストする必要があります。

私が直面している問題は、私がテストしているコードの一部がtime()への呼び出しを使用していることで、そのtime()関数がいつ呼ばれようとしているか正確にわからないという事実に基づいて、閾値時間がどうあるべきかを正確に知ることが本当に難しいと感じています。

私の質問は基本的にこれです:私のテストが「既知の時間」で動作するように、time() 呼び出しを「オーバーライド」する、または何らかの方法で時間を「モックアウト」する方法はありますか?

あるいは、私がテストしているコードで、必要であれば特定の時間を使用するように強制するために、何らかの方法で何かをしなければならないという事実を受け入れなければなりませんか?

いずれにせよ、テストに適した時間の影響を受けやすい機能を開発するための「一般的な実践」はあるのでしょうか?

編集します。 私の問題の一部は、履歴の中で物事が発生した時間が閾値に影響を与えるという事実です。以下は、私の問題の一部の例です...。

バナナを持っていて、それがいつまでに食べられなければならないか考えようとしているとします。3 日以内に賞味期限が切れるとします。ただし、何らかの化学物質を散布した場合は、賞味期限に 4 日を追加します。 スプレーをかけた時間から . そして、冷凍することでさらに3ヶ月を追加することができますが、冷凍されている場合は、解凍してから1日しか使用できません。

これらのルールはすべて、歴史的なタイミングによって決められているのです。数秒以内にテストするという Dominik の提案を使用できることには同意しますが、私の履歴データはどうなるのでしょうか? その場で「作成」する必要があるのでしょうか?

お分かりかもしれませんが、私はまだこの「テスト」の概念のすべてを把握しようとしています;)

どのように解決するのですか?

私は最近、PHP 5.3 の名前空間を使用している場合に最適な別の解決策を思いつきました。現在の名前空間内で新しい time() 関数を実装し、テストの戻り値を設定する共有リソースを作成することができます。そして、time()へのすべての非限定的な呼び出しは、新しい関数を使用します。

さらに読むために、私は私の ブログ