2017-01-18 1 views
1

Ich habe eine Schaltfläche "Freund hinzufügen" in Benutzerprofilseiten (Benutzer # anzeigen) und ich möchte testen, dass die Schaltfläche nicht auf Ihrer eigenen Profilseite (current_user istGehe zu Route in Helper-Spezifikationen in RSpec funktioniert nicht

)

ich habe dies in der Ansichtsdatei (Benutzer/show.html.haml):

- unless current_user == params[:id] 
    = button_to 'Add friend', path 

ich für sie einen Helfer erstellen möchten in UsersHelper:

module UsersHelper 
    def correct_user 
    current_user == params[:id] 
    end 
end 

So in der Sieh es dir an:

Wie teste ich das in RSpec?

In meiner spec/helpers/users_helper_spec.rb Datei ich habe:

it 'checks correct user' do 
    sign_in(user = create(:user)) 
    user2 = create(:user, name: 'foobar') 
    get :show, params: { id: user2.to_param } 
    expect(helper.correct_user).to be true 
end 

Ich habe dies für die sign_in (current_user) Entwickeln Helfer, die Zeichen in den Anwender:

RSpec.configure do |config| 
    config.include Devise::Test::ControllerHelpers, type: :helper 
end 

Grundsätzlich ist der Test fehlschlägt, weil get :show, params: { id: user2.to_param } tun gibt mir einen Fehler und gibt mir den Eindruck, dass das Routing in Helfer-Spezifikationen nicht möglich ist.

Wie gehe ich testen correct_user helper? Sollte ich es einfach auf den Controller verschieben (so kann ich get :show, params: { id: user2.to_param } in der Spezifikation tun) und es dort testen? (Und machen es nur eine Hilfsmethode helper_method :correct_user)

+0

Dieses 'current_user == params [: id]' wird immer auswerten zu 'false', weil' current_user' wird ein Objekt und 'params sein [: id]' wird id eines Objekts. –

+0

@JagdeepSingh Ja, ich habe meinen Code nicht angesehen, als ich die Frage geschrieben habe. Es ist tatsächlich 'current_user.to_param == params [: id]'. Aber Sie haben in Ihrer Antwort unten Recht, dass ich einfach das Benutzerobjekt ('@ user') verwenden soll, um es mit dem aktuellen Benutzer zu vergleichen. Vielen Dank! – puerile

Antwort

1

Sie nicht params[:id] verwenden sollten zu überprüfen, ob usercurrent_user übereinstimmt. Sie müssen die User mit params[:id] in Ihrer Controller-Aktion abgerufen haben. Nehmen wir an, Sie haben es in einer Variablen @user gespeichert. Dann können Sie Ihre Helfer und sehen wie folgt ändern:

Helper:

module UsersHelper 
    def can_add_friend?(user) 
    current_user != user 
    end 
end 

Ausblick:

- if can_add_friend?(@user) 
    = button_to 'Add friend', path 

Es wäre einfacher, jetzt rspec für diese Hilfsmethode zu schreiben.

it 'checks correct user' do 
    sign_in(user = create(:user)) 
    user2 = create(:user, name: 'foobar') 
    expect(helper.can_add_friend?(user2)).to be true 
    expect(helper.can_add_friend?(user)).to be false 
end 
+0

Das ist großartig! Da es fast eine Voraussetzung ist, '@user = User.find (params [: id])' in der Show-Aktion zu haben (users # show). Vielen Dank! – puerile

+0

BTW, warum sollte man nicht params verwenden, um mit dem current_user zu überprüfen? Ich weiß in einigen Fällen, dass es ist, wenn ich die Routen ändere, um Benutzer-IDs nicht aufzunehmen. Aber was wären die anderen Gründe? – puerile

+1

Ich denke nur, es ist ordentlich, Parameter nur im Controller zu verwenden. Ja, der Grund könnte Sie oben erwähnt haben. Sie können auf die gleiche Ansichtsdatei in anderen Routen zugreifen, in denen Sie nicht ': id' in params senden. –

Verwandte Themen