и иногда я получаю неудачные специи из-за Time.now, не могу понять, почему - PullRequest
0 голосов
/ 27 февраля 2019

, поэтому у меня есть метод в модели

class << self
  def last_week
    start = Time.zone.now.beginning_of_week - 7.days
    finish = start + 7.days
    where('appointment_at >= ? AND appointment_at < ?', start, finish).order(appointment_at: :desc)
  end
end

И я пишу спецификации для этого метода.

RSpec.describe Appointment, type: :model, vcr: { record: :none } do
  let!(:time) { Time.now }
  let(:appointment_at) { time }

  context '.last_week' do
    let!(:scoped_appointment) { create(:appointment, appointment_at: time - 2.days) }
    let!(:another_appointment) { create(:appointment, appointment_at: time - 16.days) }

    it do
      travel_to(time) do
        expect(Appointment.last_week).to include(scoped_appointment)
        expect(Appointment.last_week).not_to include(another_appointment)
      end
    end
  end
 end

И иногда я получаю сбой этой спецификации с ошибкой.

expected #<ActiveRecord::Relation []> to include #<Appointment id: 18, lead_id: 27, body: nil, appointment_at: "2019-02-25 00:59:47", google_id: nil, ... "pending", user_id: 22, notify: nil, cc_emails: nil, appointment_minutes: nil, status_message: nil>
   Diff:
   @@ -1,2 +1,2 @@
   -[#<Appointment id: 18, lead_id: 27, body: nil, appointment_at: "2019-02-25 00:59:47", google_id: nil, created_at: "2019-02-27 00:59:47", updated_at: "2019-02-27 00:59:47", timezone: nil, subject: "Meeting with Lead", address: nil, notification: nil, status: "pending", user_id: 22, notify: nil, cc_emails: nil, appointment_minutes: nil, status_message: nil>]
   +[]

Не могу понять, почему?

И у меня есть предложение, чтобы я плотно установил time

в spec_helper.rb

$now = DateTime.parse('2020-01-01 00:00:01 -0500')

это будет правильно?а почему?

1 Ответ

0 голосов
/ 01 марта 2019

Ваша тестовая установка хрупкая.Он будет прерываться в зависимости от дня недели, когда вы запускаете спецификацию.

Область в вашей модели возвращает встречи с предыдущей недели, с понедельника по воскресенье (вы звоните beginning_of_week и добавляете к нему 7 дней)

Таким образом, если ваши тесты выполняются в среду, как в приведенном вами примере, поле appointment_at встречи будет установлено на понедельник (поскольку вы вычисляете его как Time.now - 2.days).Это означает, что ваш охват не будет охватывать это назначение.

Я предлагаю вам использовать определенное время в вашей настройке.Учитывая ваши текущие настройки, использование let(:time) { DateTime.parse('2019-02-25 00:00:00') } должно работать

...