Ich habe einen RSPEZ-Test, der immer wieder fehlschlägt, und das einzige, was mir das Problem bereitet, ist, dass das Format created_at
einen mysql-Zeitstempel erzeugt, der in der Anwendung selbst nicht korrekt übersetzt wird . Hier ist mein reminders_spec.rb
Test, wo ich bin von einer Reihe von Stichprobenvariablen Reminders::LIMBO_EMAIL_INTERVAL_DAYS
(auf 3), das den Zustand festzustellen, daß das created_at
Datum ist, in dem eine E-Mail gesendet werden soll:Ist mein RSPET-Test wegen des mysql-Timestamp-Formats fehlerhaft?
describe '#send_peer_shortage_notifications' do
subject { described_class.send_peer_shortage_notifications }
context 'minimum number of peer assessments not in pending/complete and limbo email interval day' do
limbo_interval_array = Array.new(10) { |i| i*Reminders::LIMBO_EMAIL_INTERVAL_DAYS }
let!(:evaluation) { create(:evaluation, created_at: (Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME + limbo_interval_array.sample.days).ago) }
let!(:assessments) do
create_list(:assessment,
Evaluation::MINIMUM_NUM_PEERS,
evaluation: evaluation,
state: [:expired, :declined].sample)
end
it 'sends limbo email' do
puts evaluation.created_at
expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(1)
end
end
Das Ausgang von puts evaluation.created_at
ist im mysql timestamp-Format (dh 2016-04-01 19:44:43 UTC
), die nicht auf Formatierung wie .to_date
reagiert, die ich denke, verursacht möglicherweise, dass meine Tests ausfallen. Hier ist die Fehlermeldung:
Failures:
1) Reminders#send_peer_shortage_notifications minimum number of peer assessments not in pending/complete and limbo email interval day sends limbo email
Failure/Error: expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(1)
expected result to have changed by 1, but was changed by 0
# ./spec/lib/reminders_spec.rb:110:in `block (4 levels) in <top (required)>'
Hier ist die Logik in reminders.rb
wo ich .to_date
und to_i
verwenden, um days_in_limbo
herauszufinden, und stellen Sie die Bedingungen für das Senden der E-Mail:
def self.send_peer_shortage_notifications
time = Time.current - Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME
range = time..Time.current
today = Time.current.to_date
evaluations = Evaluation.arel_table
assessments = Assessment.arel_table
left_join = evaluations
.join(assessments, Arel::Nodes::OuterJoin)
.on(evaluations[:id].eq(assessments[:evaluation_id]),
assessments[:state].in([:pending, :complete]),
assessments[:assessor_id].not_in([evaluations[:user_id],
evaluations[:manager_id]]))
.join_sources
relation = Evaluation
.in_process
.joins(left_join)
.where(created_at: range)
.group(:user_id)
.having(evaluations[:user_id].count.lt(Evaluation::MINIMUM_NUM_PEERS))
relation.find_each do |evaluation|
days_in_limbo = (today - (evaluation.created_at + Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME).to_date).to_i
if days_in_limbo > 0 && days_in_limbo % Reminders::LIMBO_EMAIL_INTERVAL_DAYS == 0
EvaluationMailer.delay.limbo_notification(evaluation)
end
end
end
Hinweis: Ich möchte nur wissen, warum dieser Test weder aufgrund von Formatierung noch aus anderen Gründen weitergegeben wird, und ob es eine Möglichkeit gibt, das Format in rspec zu konvertieren, damit Informationen weitergegeben werden, die von Rails formatiert werden können. Ich bin nicht auf der Suche nach alternativen Lösungen für die Logik wie meine Cron-Jobs ändern oder Edelsteine wie whenever
oder timecop
verwenden, aber trotzdem danke, wenn das ist, was Sie :)
Was ist Ihr rspec Fehler? – Ilya
Entschuldigung ... sollte das enthalten! 'Fehler: 1) Erinnerungen # send_peer_shortage_notifications minimale Anzahl von Peer-Assessments nicht in schwebenden/vollständigen und limbo E-Mail-Intervall Tag sendet Limbo-E-Mail Fehler/Fehler: erwarten {subject} .zu ändern {ActionMailer :: Base.deliveries.count} .by (1) Das erwartete Ergebnis wurde um 1 geändert, wurde aber durch 0 # ./spec/lib/reminders_spec.rb:110:in Block (4 Stufen) in '' –
jnapolitan
besser geändert Edit question) – Ilya