2016-04-25 12 views
-1

ich Capybara verwende diesen Code zu testen, die in meinem Kommentar Modell befindet (5 Minuten sind konventionell):Link funktioniert nicht versteckt nach einiger Zeit Capybara

def editable? 
    self.created_at < (Time.now - 5.minute) 
end 

Die Ansicht des Link:

- unless comment.editable? 
    = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment) 

Also nach 5 Minuten muss der Link zum Bearbeiten von der Seite ausgeblendet werden (aber wir müssen die Seite aktualisieren). Hier ist mein Code in RSpec für Kommentare Erstellen und Testen der Link-hide-Funktionalität:

def create_comment(options={}) 
    options[:content] ||= 'I am a comment' 

    visit category_theme_path(category, theme) 
    within '.comment-form' do 
    fill_in 'Content', with: options[:content] 
    click_button 'Submit' 
    end 
end 

context 'Comment has content' do 
    before(:each) { create_comment } 

    it 'hides the edit symbol due 5 minutes after comment was created' do 
    using_wait_time 400 do 
     visit category_theme_path(category, theme) 
     save_and_open_page 
     expect(page).to have_no_css('.comment-edit') 
    end 
    end 

end 

Aber ich habe: Failure/Error: expect(page).to have_no_css('.comment-edit')expected #has_no_css?(".comment-edit") to return true, got false

Ich versuche auch page.reload! zu verwenden, expect(page).to have_no_css('.comment-edit', wait: 400) und andere damit verbundene Personal, aber Capybara don‘ Ich möchte warten. Vielleicht nutze ich using_wait_time für einen falschen Ort, wenn das - wie kann ich das testen?

enter image description here

+0

Nachdem für Ihren Test 5 Minuten warten klingt für mich nicht akzeptabel sein sollte. Können Sie dieses Verhalten auf andere Weise testen? –

+0

Immer noch verloren ... – k1r8r0wn

+0

Können Sie Ihre 'create_comment' Methode zeigen? –

Antwort

1

Es gibt eine Reihe von Dingen falsch mit Ihrem Ansatz, um dies zu testen. Der Grund dafür, dass Ihr Versuch fehlschlägt, ist, weil using_wait_time nur den Zeitraum festlegt, den Capybaras-Matcher auf ihre Erwartungen warten müssen, um wahr zu werden, so dass das Programm nicht wirklich warten muss. Daher wartet expect(page).to have_no_css('.comment-edit') bis zu der Zeit, die Ihre using_wait_time angibt, die Seite alle 50 Millisekunden für den Inhalt erneut überprüft, aber es lädt nie die Seite neu und wartet nicht vor dem Laden der Seite. Für Ihre Einstellung zur Arbeit würden Sie die Seite vor dem Besuch

it 'hides the edit symbol due 5 minutes after comment was created' do 
    sleep 5.minutes  
    visit category_theme_path(category, theme) 
    save_and_open_page 
    expect(page).to have_no_css('.comment-edit') 
end 

jedoch ist dies eine schreckliche Idee, da die Tests werden wird unglaublich langsam schlafen müssen.

Anstatt dieses Ansatzes könnten Sie Ihren Testkommentar bereits "alt" generieren (wie pascal betz vermuten lässt), etwas wie FactoryGirl verwenden und eine created_at angeben, die vor mehr als 5 Minuten erstellt wurde.

FactoryGirl.create(:comment, created_at: 5.minutes.ago) 

oder wenn Sie Ihren Kommentar über die Schnittstelle dann sind so etwas wie die Timecop Juwel fortsetzen wollen zu schaffen und Sie können

Timecop.travel(5.minutes.from_now) do 
    visit category_theme_path(category, theme) 
    save_and_open_page 
    expect(page).to have_no_css('.comment-edit') 
end 

, die die Uhr 5 Minuten nach vorne bewegen wird tun, um die Seite vor dem Besuch, und setzen Sie es dann wieder auf normal zurück, sobald der Block fertig ist.

Zusätzlich Ihre editable? Methode wird in der falschen Richtung zu vergleichen und sein sollte

def editable? 
    self.created_at > (Time.now - 5.minute) 
end 

Dann wird die Ansicht

- if comment.editable? 
    = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment) 
+0

Sehr geschätzt für Ihre Zeit, die großartige Erklärung liefert! Ich behandle es, indem ich 'Comment.last.update (created_at: 5.minutes.ago)' hinzufüge und danach deine Antwort sehe. Versuchen Sie auch, 'Timecop' zu verwenden, nur um es zu testen. – k1r8r0wn

1

Arbeit mit Samen Daten, die 5 Minuten alt ist und die Seite besuchen. So müssen Sie nicht fünf Minuten warten.

Auch Ihr Code

- unless comment.editable? 
    = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment) 

sollte lesen wahrscheinlich

- if comment.editable? 
    = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment) 
+0

Vielen Dank für Ihren Rat, es ist auch eine gute Bemerkung über die Verwendung von 'if'. – k1r8r0wn

Verwandte Themen