マイテスト"should call #logout_all"
がRSPEC:オブジェクトが
expected: 1 time with any arguments
received: 0 times with any arguments
で失敗しているが、私はrails console
直接User.verify_from_token
を呼び出すとき、私は#logout_all
が呼び出されていることを見ることができるクラスメソッド試験からメソッド呼び出しを受信していない(私は追加#logout_all
からputs
声明)
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
私は少しテストを手直しした場合、それが正常に動作します。
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
あなたの 'expect'と' User.verify_from_token token'の順序が間違っています。今すぐ最初に呼び出しを受け取り、次に期待しているメソッドを呼び出すメソッドを呼び出します。 – Kkulikovskis
いいえ、実装は正しいです。 –
FWIW実装よりも動作をテストしているので、とにかくテストの2番目のバージョンが好きです。しかし、なぜ元のバージョンが失敗しているのか分かりません。おそらくあなたは 'before'ブロックか' spec_helper.rb'の面白いコードを持っていますか?おそらく 'User#from_token'メソッドが実際にユーザオブジェクトを返すのではないでしょうか?私はそれをもう少しデバッグしてデバッグする必要があります。 –