4

フォームの送信が午後 3 時以降に行われた場合、次の日に予約できないことを確認するカスタム検証を Apt モデルで作成しました。カスタム検証が正しく機能していることを確認してください。

現在、私のテストには、テストが午後 3 時より前または後に実行されているかどうかを確認する if ステートメントが含まれており、現在のシステム時間に基づいて別のテストを使用しています。ただし、システム時間に関係なく、両方のケースをテストできるようにしたいと考えています。

test "booking appointment for tomorrow before/after three pm" do
  a = appointments(:aptone)

  # Set appointment date to tomorrow
  a.apt_date = DateTime.current + 1.day

  if (Time.current.hour >= 12)
    assert(a.invalid?, 'Appointment CANNOT be booked after 3 PM')
  elsif
    assert(a.valid?, 'Appointment CAN be booked before 3 PM')
  end
end

テストの実行中にシステム時間を一時的に設定して、テストの実行時期に関係なく両方のアサーションをテストできるようにする方法があるかどうか疑問に思っています。

4

3 に答える 3

6

あなたが言及した要件を正確に満たすように書かれたtimecop gemを強くお勧めします。github ページのドキュメント、具体的にはfreezeメソッド (またはtravel、ただし、例では凍結されたシステム時間に対してテストすることをお勧めします) を参照してください。

于 2012-08-03T13:35:21.067 に答える
6

より簡単な方法は、モッキング フレームワークを使用してDateTime.current呼び出しからの応答をスタブし、ハードコーディングされた値を返すことです。

これにより、システムクロックをいじることがなくなります。

于 2012-08-03T13:33:46.870 に答える
0

システム時間は、アプリケーションではなく OS に関連しています。したがって、設定したい場合は、Linux で date --set="STRING" を使用して設定できます。

于 2012-08-03T13:38:05.947 に答える