PHPUnit で時間を "モック" することはできますか?
質問
... 'mock' が正しい言葉なのかどうかわからない。
とにかく、私は時間ベースのいくつかのテストを書こうとしている継承されたコードベースを持っています。このような も 曖昧にならないように、コードはアイテムの履歴を見て、そのアイテムが時間のしきい値に基づいたかどうかを判断することに関連しています。
ある時点で、私はまた、その履歴に何かを追加し、閾値が今変更された(そして、明らかに、正しい)ことをチェックすることをテストする必要があります。
私が直面している問題は、私がテストしているコードの一部がtime()への呼び出しを使用していることで、そのtime()関数がいつ呼ばれようとしているか正確にわからないという事実に基づいて、閾値時間がどうあるべきかを正確に知ることが本当に難しいと感じています。
私の質問は基本的にこれです:私のテストが「既知の時間」で動作するように、time() 呼び出しを「オーバーライド」する、または何らかの方法で時間を「モックアウト」する方法はありますか?
あるいは、私がテストしているコードで、必要であれば特定の時間を使用するように強制するために、何らかの方法で何かをしなければならないという事実を受け入れなければなりませんか?
いずれにせよ、テストに適した時間の影響を受けやすい機能を開発するための「一般的な実践」はあるのでしょうか?
編集します。 私の問題の一部は、履歴の中で物事が発生した時間が閾値に影響を与えるという事実です。以下は、私の問題の一部の例です...。
バナナを持っていて、それがいつまでに食べられなければならないか考えようとしているとします。3 日以内に賞味期限が切れるとします。ただし、何らかの化学物質を散布した場合は、賞味期限に 4 日を追加します。 スプレーをかけた時間から . そして、冷凍することでさらに3ヶ月を追加することができますが、冷凍されている場合は、解凍してから1日しか使用できません。
これらのルールはすべて、歴史的なタイミングによって決められているのです。数秒以内にテストするという Dominik の提案を使用できることには同意しますが、私の履歴データはどうなるのでしょうか? その場で「作成」する必要があるのでしょうか?
お分かりかもしれませんが、私はまだこの「テスト」の概念のすべてを把握しようとしています;)
どのように解決するのですか?
私は最近、PHP 5.3 の名前空間を使用している場合に最適な別の解決策を思いつきました。現在の名前空間内で新しい time() 関数を実装し、テストの戻り値を設定する共有リソースを作成することができます。そして、time()へのすべての非限定的な呼び出しは、新しい関数を使用します。
さらに読むために、私は私の ブログ
関連
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] phpunitで単一のテストメソッドを実行する方法は?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPUnit は例外がスローされたことを表明しますか?
-
[解決済み】PHPUnitでprotectedメソッドをテストするためのベストプラクティス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】空の配列要素を削除する
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?