2016-04-08 13 views
0

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 :)

+0

Was ist Ihr rspec Fehler? – Ilya

+0

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

+0

besser geändert Edit question) – Ilya

Antwort

0

Vielen Dank für alle Kommentare/Antworten. Das Problem war die range Variable, die Auswertungen mit den created_at Daten nicht einschloss, die ich prüfte.

0

nicht 100% sicher von den Informationen vorschlagen würden zur Verfügung gestellt aber ich glaube nicht, dass sich der Zustand Ihrer Datenbank innerhalb des expect...change Blocks ändert, wie Sie es erwarten. Ich denke auch nicht, dass die Verwendung von subject in diesem Fall angemessen ist.

Ich vermute, wenn Sie subject durch den Inhalt Ihrer let s ersetzt haben, könnten Sie einen bestandenen Test erhalten. Sie können auch versuchen, let anstelle von let! zu verwenden, da let! vor den Beispielen ausgeführt wird.

Verwandte Themen