rspec希望child在调用父方法时接收方法

时间:2018-06-15 01:39:18

标签: ruby-on-rails-5 rspec-rails

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.reloadcomment.reload来确保关联是可靠的。不确定我还能做些什么。

它在我所说的方法中触发pry的事实对我来说是如此令人困惑。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

经过更多的研究后,问题在于我的comment变量实际上与RSpec在循环中看到的变量并不完全相同。它们之间的区别在于即时分配的Rails对象ID。

我需要使用间谍或存根方法来避免此问题。