2017-03-03 13 views
4

私は、JSON APIベースのアプリケーションの複雑なテストを作成するのに助けが必要です。Symfony Testing - ClockMock/DateTime

ショート問題のシナリオ:(比較のため)

  • テスト
  • EntityManagerMockがは($ temporaryEntity)を持続するためにいくつかのパラメータで
  • テストコール本当の方法を待つように設定されている一時的なエンティティを作成
  • メソッドを作成して保存しようとしました模擬EM
  • テストが失敗しますb ecause時間変化は、1秒

enter image description here

のために私たちは、ClockMockを使用しようとしましたが、それは唯一の名前空間のために/と呼ばれていたクラスの仕事です。私たちのメソッドは他の名前空間にあり、エンティティは次の名前空間に作成されます。

私たちは、PHPプラットフォーム\ DateTimeクラスを一時的にオーバーライドする方法を探しています。または、プロジェクト内のすべての名前空間/クラスに対してClockMockを使用する方法(ただし、テストのみ)。 SymfonyベースのClockMockを修正しようとしましたが、良い方法は見つかりませんでした: - /。

どうすればよいですか? (私はget_declared_class()のような使用の何かをしたいし、それclockMockと呼んではいけない::登録 - それはおよそ15.000のテストのために非常に遅いsoloutionだから - 。!/

おかげで、すべての

+0

"私たちは、PHP platform \ DateTimeクラスを一時的に無効にする方法を探しています。"私はあなたがこれをする必要がある、あるいはこれをしたいと思う理由を追いかけていません。ユニットテストでは、そのモックがどのように役立つでしょうか? –

+0

コードのrilevante部分を表示できますか? – Matteo

+0

申し訳ありませんが、ビンを貼り付けるコードを置く必要があります:http://pastebin.com/ZhBMrq4P - 単純化されていますが、主な問題があります。問題は、永続的な呼び出しの期待です。なぜなら、「新しいDateTime」は時々、より長い時間を生成するからです(テストが1秒に実行されているとき)。 ClockMockにすべてのクラスを登録することで解決策がありますが、完全なプロジェクトには非常に時間がかかります。 – Filip

答えて

4

ClockMockはしていませんnew \DateTime()のための作業だけで、時間ベースのPHPの機能上の

From the announcement of the features:。

これはあなたの 元で単一の変更を加える必要がないことを意味コードを使用する場合を除き、 がに置き換えられ、 模擬time()機能を使用する必要があります。ただし、new DateTime()を使用する場合を除きます。

したがって、次のように試してみてください。DateTimeオブジェクトの作成をtime関数を持つ名前付きコンストラクタに置き換えます。

希望

+0

それは仕事のようです!本当にありがとう! – Filip