2017-12-11 6 views
2

Ich versuche, eine authenticate Methode zu schreiben:Rspec erwägt ein Attribut als Methode

post :authenticate, params: 
    { 'email' => @user.email, 'password' => @user.password } 

Dieser Benutzer auf before(:each)

before(:each) do 
    @user = User.create([ 
     { name: 'Robot', email: '[email protected]', password: '123456', age: 10 } 
    ]) 
end 
erstellt

aber Rspec erwägt E-Mail und Passwort als Methoden und ich erhalte diese Störung

NoMethodError: 
     undefined method `email' for #<Array:0x00559ddd541d18> 

wenn ich @user.email and 0 ändern, um den Test zu stringieren.

Ich würde gerne wissen, ob ich zu Rspec und .password als Attribute von Benutzer und nicht Methoden zu sagen kann.

+0

Was ist der Wert von '@ user' ist? –

+0

@LucasAndrade, wo und wie definierst du die Benutzerinstanz für Rspec? Verwenden Sie auch Factory-Girl an der Seite Rspec? Der Fehler zeigt an, dass die Abfrage für die Instanz eines Benutzers Ihnen keine einzelne Instanz (dh: find) zurückgibt, sondern Ihnen ein Array (dh: wo) gibt. Bitte zeigen Sie den Code, wenn Sie eine Chance haben. Bitte zeigen Sie, wie Sie einen Benutzer im Vorher-Block erstellen und, wenn möglich, auch die gesamte Testdatei. – kparekh01

+0

@ kparekh01 Ich habe meine vor jedem hinzugefügt. Ich bekomme es jetzt, ich erstelle ein Array von Benutzern, also muss ich @user [0] .email @user [0] .password –

Antwort

4

Sie übergeben ein Array mit einem Hash an die create-Methode. Aus diesem Grund erkennt Rails es als Array und nicht als Benutzerobjekt.

Betrachten Sie dieses Beispiel:

@user = User.create email: '[email protected]' 
@user.email # '[email protected]' 
@user.class # User(id: integer, ...) 

Und:

@user = User.create([{ email: '[email protected]' }]) 
@user.email # NoMethodError: undefined method `title' for #<Array:0x007f8701b05b28> 
@user.class # Array 

Falls Sie ein Array von Hashes iterieren, bestimmte Benutzer erstellen Sie jede von ihnen zu wechseln brauchen würde und Dann erstelle den Benutzer, wie zum Beispiel:

[ 
    { name: 'Robot', email: '[email protected]', password: '123456', age: 10 } 
    { name: 'Other Robot', email: '[email protected]', password: 'other password', ... }, 
].each { |user| User.create user } 

Aber ich denke, das ist jetzt nicht der Fall. Sie können die Benutzerattribute einfach durch ein Komma trennen (ein Hash wäre überflüssig und ein Array würde Ihnen das Ergebnis liefern).

Versuchen Sie stattdessen:

before(:each) do 
    @user = User.create name: 'Robot', email: '[email protected]', password: '123456', age: 10 
end 

Hinweis before(:each) kann before do ... end verkürzen werden, und dass die Instanzvariablen anstatt verwenden, können Sie let verwenden:

let(:user) { User.create name: 'Robot', email: '[email protected]', password: '123456', age: 10 } 
before { user } # before each test, creates a user named "Robot" 
+0

Vielen Dank. Ich verstehe jetzt. Da ich nur ein Benutzerobjekt verwende, funktioniert Ihre Lösung in "Versuchen Sie stattdessen:" gut. 'before (: each) do @user = Benutzer.Erstellen Sie den Namen: 'Robot', E-Mail: '[email protected]', Passwort: '123456', Alter: 10 Ende' –

+0

Das ist toll. Sie können sich auch FactoryGirl (jetzt FactoryBot) ansehen, um die Erstellung der Fixtures beim Testen zu behandeln. Das könnte nützlich sein. Froh, dass ich Helfen kann. –

Verwandte Themen