Mein Test "should call #logout_all"
versagt mitRspec: Objekt nicht Methodenaufruf von Klassenmethode Test
expected: 1 time with any arguments
received: 0 times with any arguments
empfangen, aber wenn es User.verify_from_token
direkt im rails console
nenne, kann ich sehen, dass #logout_all
genannt wird (I hinzugefügt eine puts
Anweisung #logout_all
)
RSpec.describe User, type: :model do
describe ".verify_from_token" do
let(:user) {FactoryGirl.create(:user, verified: false)}
it "should return the user if found" do
token = user.to_valid_token
expect(User.verify_from_token token).to eq(user)
end
it "should verify the user" do
token = user.to_valid_token
User.verify_from_token token
expect(user.reload.verified).to eq(true)
end
it "should call #logout_all" do
token = user.to_valid_token
expect(user).to receive(:logout_all)
User.verify_from_token token
end
end
end
class User < ApplicationRecord
...
def self.verify_from_token token
user = from_token token
if user
user.update_attribute(:verified, true)
user.logout_all
user
else
nil
end
end
...
def logout_all
update_attribute(:token_timestamp, Time.now)
end
end
Wenn ich den Test leicht überarbeiten, es funktioniert gut.
it "should call #logout_all" do
token = user.to_valid_token
t1 = user.token_timestamp
User.verify_from_token token
expect(t1 < user.reload.token_timestamp).to eq(true)
end
Bestellung für Ihr 'expect' und' User.verify_from_token Token' ist falsch. Im Moment erwarten Sie, zuerst einen Anruf zu erhalten und dann nur die Methode aufzurufen, die die von Ihnen erwartete Methode aufruft. – Kkulikovskis
Nein, die Implementierung ist korrekt. https://relisapp.com/rspec/rspec-mocks/docs/basics/expecting-messages –
FWIW Ich bevorzuge trotzdem die zweite Version des Tests, da Sie eher das Verhalten als die Implementierung testen. Ich sehe jedoch nicht, warum die ursprüngliche Version versagt; hast du vielleicht einen komischen Code in einem 'before' Block oder in' spec_helper.rb'? Vielleicht gibt die 'User # from_token' Methode das Benutzerobjekt nicht wirklich zurück? Ich müsste eintauchen und es ein wenig mehr debuggen. –