class Post
has_many :comments
after_update :update_comments
def update_comments(user)
comments.where(user: user).each do |comment|
# binding.pry
comment.do_something
end
end
end
class Comment
belongs_to :post
def do_something
'Ok, I will'
# binding.pry
end
end
这是我的问题:
RSpec.describe Post do
describe '#update_comments' do
let(:post) { create :post }
let(:comment) { create :comment, post: post }
it 'triggers comment.do_something'
comment = post.comments.first
expect(comment).to receive(:do_something)
post.update(title: 'new title')
end
end
end
我收到此错误:
(#<Comment id: 1, ..., created_at: "2018-06-15 01:31:33", updated_at: "2018-05-16 02:51:39">).api_update(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
但如果我在(或两者)def(s)中使用binding.pry
,我会得到控制台,所以我知道它实际上被调用了。
我将RSpec中的comment
变量与self
类中的Comment
进行了比较,并且它们匹配。我尝试在RSpec中使用post.reload
和comment.reload
来确保关联是可靠的。不确定我还能做些什么。
它在我所说的方法中触发pry
的事实对我来说是如此令人困惑。
我错过了什么?
答案 0 :(得分:0)
经过更多的研究后,问题在于我的comment
变量实际上与RSpec在循环中看到的变量并不完全相同。它们之间的区别在于即时分配的Rails对象ID。
我需要使用间谍或存根方法来避免此问题。